标签:
Runnable是执行工作的独立任务,但是它不返回任何值,如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
一、Runnable
java.lang.Runnable是一个接口,在它里面只声明了一个run()方法:
一般情况下我们将Callable和ExecutorService配合来使用,常用的加载方式为第一个submit方法和第三个submit方法,第二个submit方法很少使用。
实验结果:
result of TaskWithResult 0
result of TaskWithResult 1
result of TaskWithResult 2
result of TaskWithResult 3
result of TaskWithResult 4
三、Future
Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
Future类位于java.util.concurrent包下,它是一个接口:
在Future接口中声明了5个方法,下面依次解释每个方法的作用:
也就是说Future提供了三种功能:
1)判断任务是否完成;
2)能够中断任务;
3)能够获取任务执行结果。
因为Future只是一个接口,所以是无法直接用来创建对象使用的,因此就有了下面的FutureTask。
四、FutureTask
public
class
FutureTask<V>
implements
RunnableFuture<V>
FutureTask提供了2个构造器:
五、应用举例
1.使用Callable+Future获取执行结果
public
class
Test {
public
static
void
main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();
Task task =
new
Task();
Future<Integer> result = executor.submit(task);
executor.shutdown();
try
{
Thread.sleep(
1000
);
}
catch
(InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(
"主线程在执行任务"
);
try
{
System.out.println(
"task运行结果"
+result.get());
}
catch
(InterruptedException e) {
e.printStackTrace();
}
catch
(ExecutionException e) {
e.printStackTrace();
}
System.out.println(
"所有任务执行完毕"
);
}
}
class
Task
implements
Callable<Integer>{
@Override
public
Integer call()
throws
Exception {
System.out.println(
"子线程在进行计算"
);
Thread.sleep(
3000
);
int
sum =
0
;
for
(
int
i=
0
;i<
100
;i++)
sum += i;
return
sum;
}
}
public
class
Test {
public
static
void
main(String[] args) {
//第一种方式
ExecutorService executor = Executors.newCachedThreadPool();
Task task =
new
Task();
FutureTask<Integer> futureTask =
new
FutureTask<Integer>(task);
executor.submit(futureTask);
executor.shutdown();
//第二种方式,注意这种方式和第一种方式效果是类似的,只不过一个使用的是ExecutorService,一个使用的是Thread
/*Task task = new Task();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
Thread thread = new Thread(futureTask);
thread.start();*/
try
{
Thread.sleep(
1000
);
}
catch
(InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(
"主线程在执行任务"
);
try
{
System.out.println(
"task运行结果"
+futureTask.get());
}
catch
(InterruptedException e) {
e.printStackTrace();
}
catch
(ExecutionException e) {
e.printStackTrace();
}
System.out.println(
"所有任务执行完毕"
);
}
}
class
Task
implements
Callable<Integer>{
@Override
public
Integer call()
throws
Exception {
System.out.println(
"子线程在进行计算"
);
Thread.sleep(
3000
);
int
sum =
0
;
for
(
int
i=
0
;i<
100
;i++)
sum += i;
return
sum;
}
标签:
原文地址:http://www.cnblogs.com/moonandstar08/p/4899338.html