介绍
从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