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 ]
[
下一页 ]