提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
复习下Java常用的三种线程创建方式
一、通过继承Thread类来创建线程
public class Demo1 extends Thread {
@Override
public void run() {
System.out.println("继承Thread实现的创建线程");
}
public static void main(String[] args) {
new Demo1().start();
}
}
二、通过实现Runnable接口来创建线程
public class Demo2 implements Runnable{
@Override
public void run() {
System.out.println("通过实现Runnable创建线程");
}
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
Thread thread = new Thread(demo2);
thread.start();
}
}
三、通过实现Callable接口来创建线程
public class Demo3 implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return "success";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Demo3 demo3 = new Demo3();
FutureTask futureTask = new FutureTask(demo3);
new Thread(futureTask,"callable").start();
//判断call方法是否结束
futureTask.isDone();
while (!futureTask.isDone()){
System.out.println("call正在被阻塞~");
}
//获取被执行call的返回值,如果未执行完会一直被阻塞
System.out.println(futureTask.get());
}
}
总结
前两种创建线程的方式应该很熟悉,常用的应该是实现Runnable接口,避免使用继承的方式影响继承其他类,要注意使用实现Callable<>创建线程的时候时可以设置泛型类型指定返回值,并且futureTask的isDone()方法可以判断线程中的call方法是否结束,如果未结束则返回false,结束则会返回true,get()方法会获取线程的返回值,如果call方法为执行完的话则会一直阻塞,等到call()方法执行完之后才会执行get()方法。