<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 方法一:Runnable接口 通常,線程池都是通過線程池工廠創建,再調用線程池中的方法獲取線程,再通過線程去執行任務方法。 * Executors:線程池創建工廠類 - `public static ExecutorService newFixedThreadPool(int nThreads)`:返回線程池對象 * ExecutorService:線程池類 - `Future<?> submit(Runnable task)`:獲取線程池中的某一個線程對象,并執行 * Future接口:用來記錄線程任務執行完畢后產生的結果。線程池創建與使用 * 使用線程池中線程對象的步驟: - 創建線程池對象 - 創建Runnable接口子類對象 - 提交Runnable接口子類對象 - 關閉線程池 ## 代碼 ~~~ public class ThreadPoolDemo { public static void main(String[] args) { //創建線程池對象 ExecutorService service = Executors.newFixedThreadPool(2);//包含2個線程對象 //創建Runnable實例對象 MyRunnable r = new MyRunnable(); //自己創建線程對象的方式 //Thread t = new Thread(r); //t.start(); ---> 調用MyRunnable中的run() //從線程池中獲取線程對象,然后調用MyRunnable中的run() service.submit(r); //再獲取個線程對象,調用MyRunnable中的run() service.submit(r); service.submit(r); //注意:submit方法調用結束后,程序并不終止,是因為線程池控制了線程的關閉。將使用完的線程又歸還到了線程池中 //關閉線程池 service.shutdown(); } } ~~~ * Runnable接口實現類 ~~~ public class MyRunnable implements Runnable { @Override public void run() { System.out.println("我要一個教練"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("教練來了: " +Thread.currentThread().getName()); System.out.println("教我游泳,交完后,教練回到了游泳池"); } } ~~~ # 方法二:Callable接口 * Callable接口:與Runnable接口功能相似,用來指定線程的任務。其中的call()方法,用來返回線程任務執行完畢后的結果,call方法可拋出異常。 * ExecutorService:線程池類 - `<T> Future<T> submit(Callable<T> task)`:獲取線程池中的某一個線程對象,并執行線程中的call()方法 * Future接口:用來記錄線程任務執行完畢后產生的結果。線程池創建與使用 * 使用線程池中線程對象的步驟: - 創建線程池對象 - 創建Callable接口子類對象 - 提交Callable接口子類對象 - 關閉線程池 ## 代碼 ~~~ public class ThreadPoolDemo { public static void main(String[] args) { //創建線程池對象 ExecutorService service = Executors.newFixedThreadPool(2); //創建Callable對象 Callable<Integer> r = () -> { System.out.println("我要一個教練"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " --- 教練來了"); System.out.println(Thread.currentThread().getName() + "--- 結束 ---"); return new Random().nextInt(10); }; //注意:submit方法調用結束后,程序并不終止,是因為線程池控制了線程的關閉。將使用完的線程又歸還到了線程池中 Future<Integer> r1 = service.submit(r); Future<Integer> r2 = service.submit(r); Future<Integer> r3 = service.submit(r); System.out.println("r1的結果" + r1.get()); System.out.println("r2的結果" + r2.get()); System.out.println("r3的結果" + r3.get()); //關閉線程池 service.shutdown(); } } ~~~ * Callable接口實現類,call方法可拋出異常、返回線程任務執行完畢后的結果 # 返回兩個數相加的結果 要求:通過線程池中的線程對象,使用Callable接口完成兩個數求和操作 * Future接口:用來記錄線程任務執行完畢后產生的結果。線程池創建與使用 - `V get()` 獲取Future對象中封裝的數據結果 代碼演示: ~~~ public class ThreadPoolDemo { public static void main(String[] args) throws InterruptedException, ExecutionException { //創建線程池對象 ExecutorService threadPool = Executors.newFixedThreadPool(2); //創建一個Callable接口子類對象 //MyCallable c = new MyCallable(); MyCallable c = new MyCallable(100, 200); MyCallable c2 = new MyCallable(10, 20); //獲取線程池中的線程,調用Callable接口子類對象中的call()方法, 完成求和操作 //<Integer> Future<Integer> submit(Callable<Integer> task) // Future 結果對象 Future<Integer> result = threadPool.submit(c); //此 Future 的 get 方法所返回的結果類型 Integer sum = result.get(); System.out.println("sum=" + sum); //再演示 result = threadPool.submit(c2); sum = result.get(); System.out.println("sum=" + sum); //關閉線程池(可以不關閉) } } ~~~ * Callable接口實現類 ~~~ public class MyCallable implements Callable<Integer> { //成員變量 int x = 5; int y = 3; //構造方法 public MyCallable(){ } public MyCallable(int x, int y){ this.x = x; this.y = y; } @Override public Integer call() throws Exception { return x+y; } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看