使用Callable接口和FutureTask来创建线程
- 创建Callable的实现类,实现call方法,可以直接使用lambda或者匿名类来创建。
- 用FutureTask包装Callable对象,该FutureTask对象封装了call方法的返回值。
- 使用FutureTask对象作为Thread的target创建并启动线程。
- 使用FutureTask的get方法来获得子线程的返回值。
- 注意:FutureTask只能执行一次,所以用两个相同task来创建线程只有一个获得执行(随机)。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class SaleWindow {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
FutureTask<Integer> task = new FutureTask<>(() -> {
int i = 0;
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
return i;
});
FutureTask<Integer> task2 = new FutureTask<>((Callable<Integer>) () -> {
int i = 0;
for (; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
return i;
});
new Thread(task, "return").start();
new Thread(task2, "other").start();
new Thread(task2, "another").start();
try {
System.out.println(task2.get());
System.out.println(task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
使用Runnable创建线程
- 使用Runnable创建线程作为target传入Thread,实质上就是Thread负责执行Runnable的run方法。
- 使用Runnable创建的同一个Runnable可以共享实例变量,注意是成员变量,而不是局部变量。
- 使用Runnable创建的线程要获得当前线程必须使用Thread.currentThread()来获取,而通过继承Thread创建的线程可以直接使用this来获取。
- 使用Runnable可以更加灵活,可以implements多个接口,而使用Thread就只能继承这一个父类。
public class SaleWindow implements Runnable {
private int i;
public void run(){
for(;i<10;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public static void main(String[] args){
System.out.println(Thread.currentThread().getName());
Runnable task = new SaleWindow();
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
}
}
网友评论