java 线程池

Posted m4tech

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 线程池相关的知识,希望对你有一定的参考价值。

java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类。

ThreadPoolExecutor extends AbstractExecutorService

构造方法属性:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler

1.Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable)返回值为void,参数为Runnable类型,就是用来执行传进去的任务的;
2.然后ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;
3.抽象类AbstractExecutorService实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法;
4.然后ThreadPoolExecutor继承了类AbstractExecutorService。

在ThreadPoolExecutor类中有几个非常重要的方法:
execute():向线程池提交一个任务,交由线程池去执行。
submit():也是用来向线程池提交任务的,能够返回任务执行的结果(利用Future)。
shutdown()和shutdownNow()是用来关闭线程池的。

 

执行过程:

  • 如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;
  • 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;
  • 如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
  • 如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。

 

 1 public class Test {
 2      public static void main(String[] args) {   
 3          ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
 4                  new ArrayBlockingQueue<Runnable>(5));
 5           
 6          for(int i=0;i<15;i++){
 7              MyTask myTask = new MyTask(i);
 8              executor.execute(myTask);
 9              System.out.println("线程池中线程数目:"+executor.getPoolSize()+",队列中等待执行的任务数目:"+
10              executor.getQueue().size()+",已执行玩别的任务数目:"+executor.getCompletedTaskCount());
11          }
12          executor.shutdown();
13      }
14 }
15  
16  
17 class MyTask implements Runnable {
18     private int taskNum;
19      
20     public MyTask(int num) {
21         this.taskNum = num;
22     }
23      
24     @Override
25     public void run() {
26         System.out.println("正在执行task "+taskNum);
27         try {
28             Thread.currentThread().sleep(4000);
29         } catch (InterruptedException e) {
30             e.printStackTrace();
31         }
32         System.out.println("task "+taskNum+"执行完毕");
33     }
34 }

 

Java通过Executors提供四种线程池,分别为:

  • newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  • newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
  • newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
public class ThreadPoolExecutorTest {
     public static void main(String[]  args ) {
        ExecutorService cacheThreadPool =Executors.newCachedThreadPool();
         for(int i =1;i<=5;i++){
             final int index=i ;
             try{
                Thread.sleep(1000);
            }catch(InterruptedException  e ) {
                 e.printStackTrace();
            }
             cacheThreadPool.execute(new Runnable(){
                 @Override
                 public void run() {
                    System.out.println("第" +index +"个线程" +Thread.currentThread().getName());    
                }    
            });
        }
    }
}

 







以上是关于java 线程池的主要内容,如果未能解决你的问题,请参考以下文章

Java线程池详解

Java 线程池详解

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

Java线程池详解

IDEA对新建java线程池的建议

java中的进程,线程,线程池总结