多線程之線程池
阿新 • • 發佈:2018-09-18
tor 創建線程 運行 類型 args ber str except .get
(1)線程池的創建 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /* * 線程池的好處:線程池裏的每一個線程代碼結束後,並不會死亡,而是再次回到線程池中成為空閑狀態,等待下一個對象來使用。 * * 如何實現線程的代碼呢? * A:創建一個線程池對象,控制要創建幾個線程對象。 * public static ExecutorService newFixedThreadPool(int nThreads) * B:這種線程池的線程可以執行: * 可以執行Runnable對象或者Callable對象代表的線程 * 做一個類實現Runnable接口。 * C:調用如下方法即可 * Future<?> submit(Runnable task) * <T> Future<T> submit(Callable<T> task) * D:我就要結束,可以嗎? * 可以。*/ public class ExecutorsDemo { public static void main(String[] args) { // 創建一個線程池對象,控制要創建幾個線程對象。 // public static ExecutorService newFixedThreadPool(int nThreads) ExecutorService pool = Executors.newFixedThreadPool(2); // 可以執行Runnable對象或者Callable對象代表的線程 pool.submit(newMyRunnable()); pool.submit(new MyRunnable()); //結束線程池 pool.shutdown(); } } public class MyRunnable implements Runnable { @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } } }
運行結果
pool-1-thread-1:0
pool-1-thread-1:1
pool-1-thread-1:2
pool-1-thread-1:3
pool-1-thread-1:4
pool-1-thread-1:5
pool-1-thread-1:6
pool-1-thread-1:7
pool-1-thread-1:8
pool-1-thread-1:9
(2)第二種方式實現線程池
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /* * 多線程實現的方式3: * A:創建一個線程池對象,控制要創建幾個線程對象。 * public static ExecutorService newFixedThreadPool(int nThreads) * B:這種線程池的線程可以執行: * 可以執行Runnable對象或者Callable對象代表的線程 * 做一個類實現Runnable接口。 * C:調用如下方法即可 * Future<?> submit(Runnable task) * <T> Future<T> submit(Callable<T> task) * D:我就要結束,可以嗎? * 可以。 */ public class CallableDemo { public static void main(String[] args) { //創建線程池對象 ExecutorService pool = Executors.newFixedThreadPool(2); //可以執行Runnable對象或者Callable對象代表的線程 pool.submit(new MyCallable()); pool.submit(new MyCallable()); //結束 pool.shutdown(); } } import java.util.concurrent.Callable; //Callable:是帶泛型的接口。 //這裏指定的泛型其實是call()方法的返回值類型。 public class MyCallable implements Callable { @Override public Object call() throws Exception { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } return null; } }
pool-1-thread-1:0
pool-1-thread-1:1
pool-1-thread-1:2
pool-1-thread-1:3
pool-1-thread-1:4
pool-1-thread-1:5
pool-1-thread-1:6
pool-1-thread-1:7
pool-1-thread-1:8
pool-1-thread-1:9
(3)第三種接口Callable使用泛型的方式返回值
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /* * 多線程實現的方式3: * A:創建一個線程池對象,控制要創建幾個線程對象。 * public static ExecutorService newFixedThreadPool(int nThreads) * B:這種線程池的線程可以執行: * 可以執行Runnable對象或者Callable對象代表的線程 * 做一個類實現Runnable接口。 * C:調用如下方法即可 * Future<?> submit(Runnable task) * <T> Future<T> submit(Callable<T> task) * D:我就要結束,可以嗎? * 可以。 */ public class CallableDemo { public static void main(String[] args) throws InterruptedException, ExecutionException { // 創建線程池對象 ExecutorService pool = Executors.newFixedThreadPool(2); // 可以執行Runnable對象或者Callable對象代表的線程 Future<Integer> f1 = pool.submit(new MyCallable(100)); Future<Integer> f2 = pool.submit(new MyCallable(200)); // V get() Integer i1 = f1.get(); Integer i2 = f2.get(); System.out.println(i1); System.out.println(i2); // 結束 pool.shutdown(); } } package cn.itcast_10; import java.util.concurrent.Callable; /* * 線程求和案例 */ public class MyCallable implements Callable<Integer> { private int number; public MyCallable(int number) { this.number = number; } @Override public Integer call() throws Exception { int sum = 0; for (int x = 1; x <= number; x++) { sum += x; } return sum; } }
多線程之線程池