如何使用Callable和FutureTask
介紹
從Java 1.5開始,在java.util.concurrent下有了新的對象集。 該程序包具有許多不同的類,包括線程隊列。 當我用Java 1.2編程時,我本可以使用那些! 當我開始看這些新玩具時,我變得猶豫不決。 這是什么可調用的東西,未來是什么? 事實證明,未來和可贖回沒有錯。 實際上,它們是我在Java生涯中一直期望的。
可調用和可運行之間的區別
可調用是Runnable希望成為的。 Callable的唯一方法是“ T call()”。 使它如此整潔的原因是它返回了一些東西。 這是必須為任務的答案創建吸氣劑的步驟。 雖然這很酷,但仍需要一種獲取返回值的方法。
未來在這里
當Callable完成時,Future有一種獲取價值的方法。 該函數是get()或get(長超時,TimeUnit單位)。 這等效于調用thread.join();。 同時運行runnable.getValue()。
例
我創建了一個名為CounterCallable的類。 它所做的只是從變量開始到變量結束加數字。
可贖回
package org.mathison.futurecallable;import java.util.concurrent.Callable;/**** @author Daryl*/ public class CounterCallable implements Callable {private long start;private long end;public CounterCallable(long start, long end) {this.start = start;this.end = end;}@Overridepublic SumTimeAnswer call() throws Exception {long sum = 0;long startTime = System.currentTimeMillis();for(long i = start; i <= end; i++){sum += i;}long endTime = System.currentTimeMillis();return new SumTimeAnswer(sum, endTime - startTime);} }SumTimeAnswer
SumTimeAnswer類實際上是一個簡單的getter類,它保存執行操作所需的時間總和。
package org.mathison.futurecallable;/**** @author Daryl*/ public class SumTimeAnswer {private long timeToFinish;private long sum;public SumTimeAnswer(long sum, long timeToFinish) {this.sum = sum;this.timeToFinish = timeToFinish;}public long getTimeToFinish() {return timeToFinish;}public long getSum() {return sum;} }應用程式
應用程序只是將所有內容匯集在一起??的主要課程
package org.mathison.futurecallable;import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask;/*** Hello world!**/ public class App {public static final long BEGIN = 0;public static final long END = 100000;public static void main( String[] args ){FutureTask task = new FutureTask(new CounterCallable(BEGIN, END));FutureTask firstHalf = new FutureTask(new CounterCallable(BEGIN, END/2));FutureTask secondHalf = new FutureTask(new CounterCallable(END/2 + 1, END));ExecutorService pool = Executors.newSingleThreadExecutor();pool.submit(task);pool.submit(firstHalf);pool.submit(secondHalf);try {SumTimeAnswer taskAnswer = task.get();System.out.println("just one thread Time: " + taskAnswer.getTimeToFinish()+ " Total: " + taskAnswer.getSum());SumTimeAnswer taskFirstAnswer = firstHalf.get();SumTimeAnswer taskSecondAnswer = secondHalf.get();long totalTime = taskFirstAnswer.getTimeToFinish() + taskSecondAnswer.getTimeToFinish();long totalSum = taskFirstAnswer.getSum() + taskSecondAnswer.getSum();System.out.println("Two thread time: " + totalTime + " Total: " + totalSum);} catch(CancellationException | InterruptedException | ExecutionException e) {e.printStackTrace();}pool.shutdown();} }結論
在本文中,使用Callable和FutureTask類來演示如何使用java.util.concurrent包。
翻譯自: https://www.javacodegeeks.com/2014/10/how-to-use-callable-and-futuretask.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的如何使用Callable和FutureTask的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring请求级备忘录
- 下一篇: Apache Lucene 5.0.0即