java使用任務(wù)架構(gòu)執(zhí)行任務(wù)調(diào)度示例
package com.yao;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 新的任務(wù)執(zhí)行架構(gòu)。
* 在Java 5.0之前啟動(dòng)一個(gè)任務(wù)是通過(guò)調(diào)用Thread類(lèi)的start()方法來(lái)實(shí)現(xiàn)的,
* 任務(wù)的提于交和執(zhí)行是同時(shí)進(jìn)行的,如果你想對(duì)任務(wù)的執(zhí)行進(jìn)行調(diào)度,
* 或是控制同時(shí)執(zhí)行的線(xiàn)程數(shù)量就需要額外編寫(xiě)代碼來(lái)完成。
* 5.0里提供了一個(gè)新的任務(wù)執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務(wù)的執(zhí)行,
* 并且可以建立一個(gè)類(lèi)似數(shù)據(jù)庫(kù)連接池的線(xiàn)程池來(lái)執(zhí)行任務(wù)。
* 這個(gè)架構(gòu)主要有三個(gè)接口和其相應(yīng)的具體類(lèi)組成。
* 這三個(gè)接口是Executor, ExecutorService和ScheduledExecutorService。
* (1)Executor接口:是用來(lái)執(zhí)行Runnable任務(wù)的,它只定義一個(gè)方法:
* execute(Runnable command):執(zhí)行Ruannable類(lèi)型的任務(wù)
* (2)ExecutorService:繼承了Executor的方法,并提供了執(zhí)行Callable任務(wù)和中止任務(wù)執(zhí)行的服務(wù),
* 其定義的方法主要有:
* submit(task):可用來(lái)提交Callable或Runnable任務(wù),并返回代表此任務(wù)的Future對(duì)象
* invokeAll(collection of tasks):批處理任務(wù)集合,并返回一個(gè)代表這些任務(wù)的Future對(duì)象集合
* shutdown():在完成已提交的任務(wù)后關(guān)閉服務(wù),不再接受新任務(wù)
* shutdownNow():停止所有正在執(zhí)行的任務(wù)并關(guān)閉服務(wù)。
* isTerminated():測(cè)試是否所有任務(wù)都執(zhí)行完畢了。
* isShutdown():測(cè)試是否該ExecutorService已被關(guān)閉
* (3)ScheduledExecutorService:繼承ExecutorService,提供了按時(shí)間安排執(zhí)行任務(wù)的功能、
* schedule(task, initDelay): 安排所提交的Callable或Runnable任務(wù)在initDelay指定的時(shí)間后執(zhí)行。
* scheduleAtFixedRate():安排所提交的Runnable任務(wù)按指定的間隔重復(fù)執(zhí)行
* scheduleWithFixedDelay():安排所提交的Runnable任務(wù)在每次執(zhí)行完后,等待delay所指定的時(shí)間后重復(fù)執(zhí)行。
*
* 通過(guò)Executors類(lèi)來(lái)獲得各種服務(wù)對(duì)象。
* callable(Runnable task): 將Runnable的任務(wù)轉(zhuǎn)化成Callable的任務(wù)
* newSingleThreadExecutor: 產(chǎn)生一個(gè)ExecutorService對(duì)象,這個(gè)對(duì)象只有一個(gè)線(xiàn)程可用來(lái)執(zhí)行任務(wù),若任務(wù)多于一個(gè),任務(wù)將按先后順序執(zhí)行。
* newCachedThreadPool(): 產(chǎn)生一個(gè)ExecutorService對(duì)象,這個(gè)對(duì)象帶有一個(gè)線(xiàn)程池,線(xiàn)程池的大小會(huì)根據(jù)需要調(diào)整,線(xiàn)程執(zhí)行完任務(wù)后返回線(xiàn)程池,供執(zhí)行下一次任務(wù)使用。
* newFixedThreadPool(int poolSize):產(chǎn)生一個(gè)ExecutorService對(duì)象,這個(gè)對(duì)象帶有一個(gè)大小為poolSize的線(xiàn)程池,若任務(wù)數(shù)量大于poolSize,任務(wù)會(huì)被放在一個(gè)queue里順序執(zhí)行。
* newSingleThreadScheduledExecutor:產(chǎn)生一個(gè)ScheduledExecutorService對(duì)象,這個(gè)對(duì)象的線(xiàn)程池大小為1,若任務(wù)多于一個(gè),任務(wù)將按先后順序執(zhí)行。
* newScheduledThreadPool(int poolSize): 產(chǎn)生一個(gè)ScheduledExecutorService對(duì)象,這個(gè)對(duì)象的線(xiàn)程池大小為poolSize,若任務(wù)數(shù)量大于poolSize,任務(wù)會(huì)在一個(gè)queue里等待執(zhí)行
*/
public class ExecuteArch {
/**
* 該線(xiàn)程輸出一行字符串
*/
public static class MyThread implements Runnable {
public void run() {
System.out.println("Task repeating. " + System.currentTimeMillis());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Task interrupted. "
+ System.currentTimeMillis());
}
}
}
/**
* 該Callable結(jié)束另一個(gè)任務(wù)
*/
public static class MyCallable implements Callable {
private Future future;
public MyCallable(Future future) {
this.future = future;
}
public String call() {
System.out.println("To cancell Task..."
+ +System.currentTimeMillis());
this.future.cancel(true);
return "Task cancelled!";
}
}
/**
* @param args
* @throws ExecutionException
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException,
ExecutionException {
// 產(chǎn)生一個(gè)ExecutorService對(duì)象,這個(gè)對(duì)象帶有一個(gè)線(xiàn)程池,線(xiàn)程池的大小會(huì)根據(jù)需要調(diào)整,
// 線(xiàn)程執(zhí)行完任務(wù)后返回線(xiàn)程池,供執(zhí)行下一次任務(wù)使用。
ExecutorService cachedService = Executors.newCachedThreadPool();
Future myThreadFuture = cachedService.submit(new MyThread());
Future myCallableFuture = cachedService.submit(new MyCallable(
myThreadFuture));
System.out.println(myCallableFuture.get());
System.out.println("-----------------");
// 將Runnable任務(wù)轉(zhuǎn)換成Callable任務(wù)
Callable myThreadCallable = Executors.callable(new MyThread());
Future myThreadCallableFuture = cachedService.submit(myThreadCallable);
// 對(duì)于Runnable任務(wù),轉(zhuǎn)換成Callable任務(wù)后,也沒(méi)有返回值
System.out.println(myThreadCallableFuture.get());
cachedService.shutdownNow();
System.out.println("-----------------");
// 產(chǎn)生一個(gè)ExecutorService對(duì)象,這個(gè)對(duì)象帶有一個(gè)大小為poolSize的線(xiàn)程池,
// 若任務(wù)數(shù)量大于poolSize,任務(wù)會(huì)被放在一個(gè)queue里順序執(zhí)行
ExecutorService fixedService = Executors.newFixedThreadPool(2);
fixedService.submit(new MyThread());
fixedService.submit(new MyThread());
// 由于線(xiàn)程池大小為2,所以后面的任務(wù)必須等待前面的任務(wù)執(zhí)行完后才能被執(zhí)行。
myThreadFuture = fixedService.submit(new MyThread());
myCallableFuture = fixedService.submit(new MyCallable(myThreadFuture));
System.out.println(myCallableFuture.get());
fixedService.shutdownNow();
System.out.println("-----------------");
// 產(chǎn)生一個(gè)ScheduledExecutorService對(duì)象,這個(gè)對(duì)象的線(xiàn)程池大小為poolSize,
// 若任務(wù)數(shù)量大于poolSize,任務(wù)會(huì)在一個(gè)queue里等待執(zhí)行
ScheduledExecutorService fixedScheduledService = Executors
.newScheduledThreadPool(2);
// 新建任務(wù)1
MyThread task1 = new MyThread();
// 使用任務(wù)執(zhí)行服務(wù)立即執(zhí)行任務(wù)1,而且此后每隔2秒執(zhí)行一次任務(wù)1。
myThreadFuture = fixedScheduledService.scheduleAtFixedRate(task1, 0, 2,
TimeUnit.SECONDS);
// 新建任務(wù)2
MyCallable task2 = new MyCallable(myThreadFuture);
// 使用任務(wù)執(zhí)行服務(wù)等待5秒后執(zhí)行任務(wù)2,執(zhí)行它后會(huì)將任務(wù)1關(guān)閉。
myCallableFuture = fixedScheduledService.schedule(task2, 5,
TimeUnit.SECONDS);
System.out.println(myCallableFuture.get());
fixedScheduledService.shutdownNow();
}
}
- Java任務(wù)調(diào)度的常見(jiàn)實(shí)現(xiàn)方法與比較詳解
- Java中Spring使用Quartz任務(wù)調(diào)度定時(shí)器
- java多線(xiàn)程并發(fā)executorservice(任務(wù)調(diào)度)類(lèi)
- Spring整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法
- Spring整合TimerTask實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度
- Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置詳解
- springboot+Quartz實(shí)現(xiàn)任務(wù)調(diào)度的示例代碼
- Spring 中使用Quartz實(shí)現(xiàn)任務(wù)調(diào)度
- spring boot異步(Async)任務(wù)調(diào)度實(shí)現(xiàn)方法
- 使用java.util.Timer實(shí)現(xiàn)任務(wù)調(diào)度
相關(guān)文章
Java多線(xiàn)程編程中的線(xiàn)程死鎖的問(wèn)題解決
線(xiàn)程死鎖是多線(xiàn)程編程中的一個(gè)常見(jiàn)問(wèn)題,它發(fā)生在多個(gè)線(xiàn)程互相等待對(duì)方釋放資源的情況下,導(dǎo)致程序無(wú)法繼續(xù)執(zhí)行,本文就來(lái)介紹一下Java多線(xiàn)程編程中的線(xiàn)程死鎖的問(wèn)題解決,感興趣的可以了解一下2023-08-08Java動(dòng)態(tài)調(diào)用類(lèi)中方法代碼
這篇文章主要介紹了Java動(dòng)態(tài)調(diào)用類(lèi)中方法代碼,需要的朋友可以參考下2014-02-02Java 使用maven實(shí)現(xiàn)Jsoup簡(jiǎn)單爬蟲(chóng)案例詳解
這篇文章主要介紹了Java 使用maven實(shí)現(xiàn)Jsoup簡(jiǎn)單爬蟲(chóng)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Springmvc模式上傳和下載與enctype對(duì)比
這篇文章主要介紹了Springmvc模式上傳和下載與enctype對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)之整合Swagger2到通用模塊
這篇文章主要為大家介紹了實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)之整合Swagger2到通用模塊,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04java多線(xiàn)程返回值使用示例(callable與futuretask)
這篇文章主要介紹了多線(xiàn)程返回值使用示例(callable與futuretask),需要的朋友可以參考下2014-04-04Java ScheduledExecutorService的具體使用
ScheduledExecutorService有線(xiàn)程池的特性,也可以實(shí)現(xiàn)任務(wù)循環(huán)執(zhí)行,本文主要介紹了Java ScheduledExecutorService的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05