打字猴:1.700450539e+09
1700450539
1700450540 T2是无法避免的,只有通过优化代码来实现降低运行时间。T1和T2都可以通过线程池(Thread Pool)来缩减时间,比如在容器(或系统)启动时,创建足够多的线程,当容器(或系统)需要时直接从线程池中获得线程,运算出结果,再把线程返回到线程池中—ExecutorService就是实现了线程池的执行器,我们来看一个示例代码:
1700450541
1700450542 public static void main(String[]args){
1700450543
1700450544 //2个线程的线程池
1700450545
1700450546 ExecutorService es=Executors.newFixedThreadPool(2);
1700450547
1700450548 //多次执行线程体
1700450549
1700450550 for(int i=0;i<4;i++){
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)
[ 上一页 ]  [ :1.700450539e+09 ]  [ 下一页 ]