介绍
Callable是创建线程的方式之一(本片仅作入门了解)
使用步骤
- 自定义类实现Callable接口
- 自定义类重写call方法
- 创建自定义类对象
- 创建执行服务
- 提交服务
- 获取结果
- 关闭执行服务
Demo案例
自定义类:
package callable.learn;
import java.util.concurrent.Callable;
public class CallableDemo implements Callable<Boolean> {
private static String winner;
@Override
public Boolean call() throws Exception {
for (int i = 0; i <= 100; i++) {
String name = Thread.currentThread().getName();
System.out.println(name + "跑到" + i + "位置");
if (gameOver(i)) {
break;
}
}
return true;
}
private boolean gameOver(int i) {
if (winner == null) {
if (i == 100) {
winner = Thread.currentThread().getName();
System.out.println(winner + "跑赢了比赛");
return true;
}
return false;
} else {
return true;
}
}
}
主线程类:
package callable.learn;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class RunCallableDemo {
public static void main(String[] args) throws InterruptedException, ExecutionException {
CallableDemo callableDemo = new CallableDemo();
ExecutorService excutor = Executors.newFixedThreadPool(2);
Future<Boolean> future1 = excutor.submit(callableDemo);
Future<Boolean> future2 = excutor.submit(callableDemo);
Boolean boolean1 = future1.get();
Boolean boolean2 = future2.get();
System.out.println(boolean1);
System.out.println(boolean2);
excutor.shutdownNow();
}
}
运行结果: