Thread(让一个类继承Thread类,并重写run方法,run方法中是任务代码)
任务和线程结合在依次
public class CreateThread {
public static void main(String[] args) throws ExecutionException, InterruptedException {
new Thread(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}.start();
System.out.println(Thread.currentThread().getName());
}
}
Runable(让一个类继承Runable接口,并重写run方法,run方法中是任务代码)
把任务和线程分离,使用Runable更容易和线程池等高级API配合。
使用Runable让任务脱离了Thread继承体系,更轻巧,更灵活。
public class CreateThread2 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
new Thread(runnable).start();
System.out.println(Thread.currentThread().getName());
}
}
Callable(让一个类继承Callable接口,并重写call方法,call方法中是任务代码)
使用Callable接口可以有返回值,返回值通过FutureTask对象的get()方法获取,如果线程没有执行结束会阻塞等待。
public class CreateThread3 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName());
return 0;
}
});
new Thread(futureTask).start();
System.out.println(Thread.currentThread().getName());
// 获取执行结果
System.out.println(futureTask.get());
}
}