线程池 调度 java_java调度器和线程池总结
一、推薦使用的調(diào)度器和線程池
1、調(diào)度器
//2個線程的調(diào)度器
private static ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(2);
//5秒鐘后每3分鐘執(zhí)行一次
pool.scheduleAtFixedRate(new TestTask(), 5, 60 * 3, TimeUnit.SECONDS);
;
2、線程池
//10個線程的線程池
ExecutorService pool = Executors.newFixedThreadPool(10);
//執(zhí)行一個線程
pool.execute(new TestTask());
線程:
class TestTesk implements Runnable{
@Override
public void run() {
System.out.println("執(zhí)行2....");
}
}
二、timer和timertask
Timer是一種線程設(shè)施,用于安排以后在后臺線程中執(zhí)行的任務(wù)。可安排任務(wù)執(zhí)行一次,或者定期重復(fù)執(zhí)行,可以看成一個定時器,可以調(diào)度TimerTask。TimerTask是一個抽象類,實(shí)現(xiàn)了Runnable接口,所以具備了多線程的能力。
一個Timer可以調(diào)度任意多個TimerTask,它會將TimerTask存儲在一個隊(duì)列中,順序調(diào)度,如果想兩個TimerTask并發(fā)執(zhí)行,則需要創(chuàng)建兩個Timer。下面來看一個簡單的例子:
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
static class MyTimerTask1 extends TimerTask {
public void run() {
System.out.println("爆炸!!!");
}
}
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new MyTimerTask1(), 2000);// 兩秒后啟動任務(wù)
//已當(dāng)前時間為起點(diǎn),每隔兩秒執(zhí)行一次
//timer.schedule(new MyTimerTask1(), new Date(), 2000);// 兩秒后啟動任務(wù)?}
}
三、比較
Timer對調(diào)度的支持是基于絕對時間的,因此任務(wù)對系統(tǒng)時間的改變是敏感的;而ScheduledThreadPoolExecutor支持相對時間。
Timer使用單線程方式來執(zhí)行所有的TimerTask,如果某個TimerTask很耗時則會影響到其他TimerTask的執(zhí)行;而ScheduledThreadPoolExecutor則可以構(gòu)造一個固定大小的線程池來執(zhí)行任務(wù)。
Timer 不會捕獲由TimerTask拋出的未檢查異常,故當(dāng)有異常拋出時,Timer會終止,導(dǎo)致未執(zhí)行完的TimerTask不再執(zhí)行,新的 TimerTask也不能被調(diào)度;ScheduledThreadPoolExecutor對這個問題進(jìn)行了妥善的處理,不會影響其他任務(wù)的執(zhí)行。
總結(jié):timer任務(wù)一旦有一個出錯那么所有的任務(wù)都會中斷,而ScheduledThreadPoolExecutor只會停止出錯任務(wù)而不會停止其他任務(wù)
下面是一個ScheduledThreadPoolExecutor出錯的例子:
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ScheduleTest {
public static void main(String[] args) {
ScheduledThreadPoolExecutor schedule = new ScheduledThreadPoolExecutor(2);
schedule.scheduleAtFixedRate(new TestTesk(), 2, 5, TimeUnit.SECONDS);
schedule.scheduleAtFixedRate(new TestTesk2(), 2, 5, TimeUnit.SECONDS);
}
}
class TestTesk implements Runnable{
@Override
public void run() {
System.out.println("執(zhí)行1....");
String a = null;
System.out.println(a.length());
}
}
class TestTesk2 implements Runnable{
@Override
public void run() {
System.out.println("執(zhí)行2....");
}
}
總結(jié)
以上是生活随笔為你收集整理的线程池 调度 java_java调度器和线程池总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: matlab的输出(命令窗口、fprin
 - 下一篇: 计算机的硬件发展趋势为,高性能计算机的发