实现多线程的第三种方式之Callable
程序员文章站
2022-07-10 18:15:46
...
前面在《java多线程基础》中说过,实现多线程有两种方式:一种是继承Thread类,另一种是实现Runnable接口。这两种方式中真正起作用的是run方法,不过run方法并没有返回值。如果我们希望任务在完成时能够有返回值,这时就可以使用JDK1.5提供的Callable接口了,Callable是一种具有类型参数的泛型,它的类型参数表示的是从call()方法中返回的值,可以使用ExecutorService或CompletionService的submit()方法来调用,返回值是Future类型,表示异步计算的结果,只能使用get()方法来获取结果。
下面使用Callable实现打印一个斐波那契数列并返回其总和。
package com.gk.thread.callable;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Long>{
private int count;
public MyCallable(int count) {
this.count = count;
}
@Override
public Long call() {
long x = 1 , y = 1;
long z = 0;
long sum = x + y;
System.out.print("前" + count + "个斐波那契数列是 : " + x + ", " + y + ", ");
for (int i=1; i<=count-2; i++) {
z = x + y;
System.out.print(z);
if(i < count-2)
System.out.print(", ");
x = y;
y = z;
sum += z;
}
System.out.println();
return sum;
}
}
测试代码
package com.gk.thread.callable;
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;
public class Test {
public static void main(String[] args) throws InterruptedException, ExecutionException {
final int NUMBER = 10;
ExecutorService es = Executors.newSingleThreadExecutor();
Callable<Long> cc = new MyCallable(NUMBER);
Future<Long> f = es.submit(cc);
System.out.println("总数为" + f.get());
es.shutdown();
}
}
虽然Callable可以获取返回值,但是我们也看到了,Callable使用起来还是很麻烦的,而且应用也不是很大,所以一般不怎么用。
上一篇: 线程池(实现多线程的第三种方式)