实现多线程有三个方法继承Thread和实现Runable,Callable
Thread不建议使用:
- 一个类只能有一个父类,能用接口就不要用继承
- 因为我们一般用线程池不是直接new Thread()
Runable:
- 没有返回值,多开了一个线程跑到多少步了不知道
Callable
- 有返回值,可以知道跑到哪一步,不想知道也可以不知道
只拿Runable和Callable举例子
public class TestRunable implements Runnable{
@Override
public void run() {
try {
System.out.println("Runable要睡2秒");
Thread.sleep(2000);
System.out.println("Runable睡2秒结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class TaskCallable implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("我要睡眠2秒");
Thread.sleep(2000);
System.out.println("我睡完了");
return "success";
}
}
public class TestMain2 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
/******************Callable测试开始***************************/
TaskCallable taskCallable = new TaskCallable();
FutureTask<String> task = new FutureTask<>(taskCallable);
new Thread(task).start();
//FutureTask的get方法会阻塞主线程,如果不用get则不会阻塞,get可以获取返回值
String message = task.get();
System.out.println(message);
System.out.println("end");
/******************Callable测试结束***************************/
/******************Runable测试开始***************************/
new Thread(new TestRunable()).start();
System.out.println("结束");
/******************Runable测试结束***************************/
}
}
控制台打印如下
我要睡眠2秒
我睡完了
success
end
结束
Runable要睡2秒
Runable睡2秒结束