打字猴:1.700450551e+09
1700450551
1700450552 es.submit(new Runnable(){
1700450553
1700450554 public void run(){
1700450555
1700450556 System.out.println(Thread.currentThread().getName());
1700450557
1700450558 }
1700450559
1700450560 });
1700450561
1700450562 }
1700450563
1700450564 //关闭执行器
1700450565
1700450566 es.shutdown();
1700450567
1700450568 }
1700450569
1700450570 此段代码首先创建了一个包含两个线程的线程池,然后在线程池中多次运行线程体,输出运行时的线程名称,结果如下:
1700450571
1700450572 pool-1-thread-1
1700450573
1700450574 pool-1-thread-2
1700450575
1700450576 pool-1-thread-1
1700450577
1700450578 pool-1-thread-2
1700450579
1700450580 本次代码执行了4遍线程体,按照我们之前阐述的“一个线程不可能从结束状态转变为可运行状态”,那为什么此处的2个线程可以反复使用呢?这就是我们要搞清楚的重点。
1700450581
1700450582 线程池的实现涉及以下三个名词:
1700450583
1700450584 (1)工作线程(Worker)
1700450585
1700450586 线程池中的线程,只有两个状态:可运行状态和等待状态,在没有任务时它们处于等待状态,运行时可以循环地执行任务。
1700450587
1700450588 (2)任务接口(Task)
1700450589
1700450590 这是每个任务必须实现的接口,以供工作线程调度器调度,它主要规定了任务的入口、任务执行完的场景处理、任务的执行状态等。这里有两种类型的任务:具有返回值(或异常)的Callable接口任务和无返回值并兼容旧版本的Runnable接口任务。
1700450591
1700450592 (3)任务队列(Wok Queue)
1700450593
1700450594 也叫做工作队列,用于存放等待处理的任务,一般是BlockingQueue的实现类,用来实现任务的排队处理。
1700450595
1700450596 我们首先从线程池的创建说起,Executors.newFixedThreadPool(2)表示创建一个具有2个线程的线程池,源代码如下:
1700450597
1700450598 public class Executors{
1700450599
1700450600 public static ExecutorService newFixedThreadPool(int nThreads){
[ 上一页 ]  [ :1.700450551e+09 ]  [ 下一页 ]