ExecutorService建立线程池

来源:互联网 发布:语音录制软件ios 编辑:程序博客网 时间:2024/05/21 17:56

一: ExecutorService executorService = Executors.newCacheThreadPool();

根据需要创建一个新的线程池,不过以前创建的线程池可用时则复用以前创建的线程池。这些池通常会提高执行的很多短期异步任务的程序的性能。调用execute(如果可用)将重用以前构造的线程。如果没有现有线程可用,一个新的线程将被创建并添加到池中。尚未使用的60秒线程终止和从缓存中移除。因此,剩下的空闲足够长池不会消耗任何资源。需要注意的是具有类似性质的,但不同的信息(例如,超时参数)池可能使用的ThreadPoolExecutor构造来创建。

codes:

 ExecutorService executorService = Executors.newCacheThreadPool();

for(int i = 0;i < 100;i++){

     final int index  = i;

     try {
Thread.sleep(index * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

     executorService.execute(new Runnable(){

           system.out.printLn(index);            

     });

}

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

二:ExecutorService executorService = Executors.newFixesThreadPool(int nThread);

创建一个使用操作关闭共享的无界队列的线程固定数量的线程池。在任何时候,至多线程的线程将被激活的处理任务。如果额外的任务提交时,所有线程处于活动状态,他们将在队列中等待,直到某个线程可用。如果任何线程关闭前的执行过程中终止因故障,如果需要执行后续任务,将会有新取而代之。池中的线程将一直存在,直到它明确地关闭。

codes:

ExecutorService executorService = Executors.newFixesThreadPool(6);

for(int i = 0;i < 100;i++){

    final index = i;

    executorService.execute(new Runnable(){

    try{

        system.out.printLn(index);  

Thread.sleep(2000);     

    }(InterruptedException e) {
  e.printStackTrace();
}            

     });

}

线程池的大小为6.

三:ScheduledExecutorService executorService = Executors.newScheduledThreadPool(int corePoolSize);corePoolSize(保持在线程池里面线程的数量,即使他们是空闲的)

创建一个定长线程池,支持定时及周期性任务执行。

codes:

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(6);

scheduledThreadPool.schedule(new Runnable() {

@Override

public void run() {

System.out.println("delay 3seconds");

}

}, 3, TimeUnit.SECONDS);

每三秒执行一次,

ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(6);

scheduledThreadPool.schedule(newRunnable() {

@Override

public void run() {

System.out.println("delay3 seconds");

}

},1, 3, TimeUnit.SECONDS);

延迟一秒,每三秒执行一次。

四:ExecutorService executorService = Executors.newSingleThreadExecutor();

创建一个使用单个worker线程操作以无界队列的执行人。(但是请注意,如果这个单一线程执行之前关闭期间终止由于故障,一个新的将在需要时执行后续的任务取代其位置。)任务被保证顺序地执行,以及不超过一个的任务将是有源在任何给定的时间。与其他等效的newFixedThreadPool(1)所返回的执行保证无需重新配置使用其他的线程。

codes:

ExecutorService singleThreadExecutor= Executors.newSingleThreadExecutor();

for (int i = 0; i < 10; i++){

final int index = i;

singleThreadExecutor.execute(newRunnable() {

@Override

public void run() {

try {

System.out.println(index);

Thread.sleep(2000);

} catch (InterruptedExceptione) {

// TODO Auto-generated catchblock

e.printStackTrace();

}

}

});

}

它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO,优先级)执行。
0 0
原创粉丝点击