1、线程池的体系结构:
2、工具类 Executors:
//创建一个定长的线程池 ExecutorService executorService = Executors.newFixedThreadPool(5); //创建一个可以缓存的线程池会回收线程,如果没有可回收,就创建 ExecutorService executorService1 = Executors.newCachedThreadPool(); //创建一个单线程的线程池 ExecutorService executorService3 = Executors.newSingleThreadScheduledExecutor(); //创建一个线程池,该线程池可以调度在给定延迟之后运行的命令,或者定期执行命令。 ExecutorService executorService4 = Executors.newScheduledThreadPool(5);
模拟场景:
如果:
核心线程:5
最大线程:10
如果5个核心线程都在忙碌,还来任务就会放入队列中等待,如果还又源源不断的任务,就会创建新线程,过一段时间,会剔除非核心线程
3、使用线程池:
(1)、定长线程池使用
package com.fyd; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestThreadPool { public static void main(String[] args) { //创建线程池 ExecutorService executorService = Executors.newFixedThreadPool(5); //将线程交给线程池 for (int i=0;i<10;i++){ executorService.submit(new PoolRunnable()); } //关闭 executorService.shutdown(); } } class PoolRunnable implements Runnable{ @Override public void run() { for (int i=0;i<10;i++){ System.out.println(i); } } }
(2)、定长线程池使用
package com.fyd; import java.util.concurrent.*; public class TestThreadPool { public static void main(String[] args) { try { //创建线程池 ExecutorService executorService = Executors.newFixedThreadPool(5); //将线程交给线程池 for (int i = 0; i < 10; i++) { Future<Object> submit = executorService.submit(new Callable<Object>() { @Override public Object call() throws Exception { int sum = 0; for (int i = 0; i < 10; i++) { sum += i; } return sum; } }); System.out.println(submit.get()); } //关闭 executorService.shutdown(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
2、延迟运行线程池
package com.fyd; import java.util.concurrent.*; public class TestSchduledThreadPool { public static void main(String[] args) { try { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); for (int i = 0; i < 10; i++) { ScheduledFuture<Integer> schedule = scheduledExecutorService.schedule(new Callable<Integer>() { @Override public Integer call() throws Exception { int sum = 0; for (int i = 0; i < 10; i++) { sum += i; } return sum; } }, 1, TimeUnit.SECONDS); System.out.println(schedule.get()); } scheduledExecutorService.shutdown(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }