日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程池 调度 java_java调度器和线程池总结

發布時間:2023/12/20 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程池 调度 java_java调度器和线程池总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、推薦使用的調度器和線程池

1、調度器

//2個線程的調度器

private static ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(2);

//5秒鐘后每3分鐘執行一次

pool.scheduleAtFixedRate(new TestTask(), 5, 60 * 3, TimeUnit.SECONDS);

;

2、線程池

//10個線程的線程池

ExecutorService pool = Executors.newFixedThreadPool(10);

//執行一個線程

pool.execute(new TestTask());

線程:

class TestTesk implements Runnable{

@Override

public void run() {

System.out.println("執行2....");

}

}

二、timer和timertask

Timer是一種線程設施,用于安排以后在后臺線程中執行的任務??砂才湃蝿請绦幸淮?#xff0c;或者定期重復執行,可以看成一個定時器,可以調度TimerTask。TimerTask是一個抽象類,實現了Runnable接口,所以具備了多線程的能力。

一個Timer可以調度任意多個TimerTask,它會將TimerTask存儲在一個隊列中,順序調度,如果想兩個TimerTask并發執行,則需要創建兩個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);// 兩秒后啟動任務

//已當前時間為起點,每隔兩秒執行一次

//timer.schedule(new MyTimerTask1(), new Date(), 2000);// 兩秒后啟動任務?}

}

三、比較

Timer對調度的支持是基于絕對時間的,因此任務對系統時間的改變是敏感的;而ScheduledThreadPoolExecutor支持相對時間。

Timer使用單線程方式來執行所有的TimerTask,如果某個TimerTask很耗時則會影響到其他TimerTask的執行;而ScheduledThreadPoolExecutor則可以構造一個固定大小的線程池來執行任務。

Timer 不會捕獲由TimerTask拋出的未檢查異常,故當有異常拋出時,Timer會終止,導致未執行完的TimerTask不再執行,新的 TimerTask也不能被調度;ScheduledThreadPoolExecutor對這個問題進行了妥善的處理,不會影響其他任務的執行。

總結:timer任務一旦有一個出錯那么所有的任務都會中斷,而ScheduledThreadPoolExecutor只會停止出錯任務而不會停止其他任務

下面是一個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("執行1....");

String a = null;

System.out.println(a.length());

}

}

class TestTesk2 implements Runnable{

@Override

public void run() {

System.out.println("執行2....");

}

}

總結

以上是生活随笔為你收集整理的线程池 调度 java_java调度器和线程池总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。