继承Thread
public class ThreadTest {
public static class MyThread extends Thread{
@Override
public void run(){
try {
Thread.sleep(100);
System.out.println("Hello thead");
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("Mains");
}
}
- 可以直接使用 this 获取当前线程
- Java 不支持多继承, 如果继承了 Thread 就不能继承其他类了
- 任务与代码没有分离, 如果多个线程执行一样的任务时需要多份任务代码
- 没有返回值
实现Runnable接口
public class ThreadTest {
public static class RunableTask implements Runnable{
@Override
public void run(){
try {
Thread.sleep(100);
System.out.println("Hello thead");
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
RunableTask runableTask = new RunableTask();
new Thread(runableTask).start();
new Thread(runableTask).start();
System.out.println("Main");
}
}
- 多个线程可以共享一份 task 代码逻辑
- RunAbleTask 可以继承其他类
- 没有返回值
用 FutureTask 创建一个线程
public class ThreadTest implements Callable<String>{
@Override
public String call() throws Exception{
Thread.sleep(100);
return "hello world";
}
public static void main(String[] args) {
FutureTask<String> futureTask = new FutureTask<>(new ThreadTest());
new Thread(futureTask).start();
String result = null;
try{
result = futureTask.get();
}catch (InterruptedException | ExecutionException e){
e.printStackTrace();
}
System.out.println(result);
System.out.println("Mains");
}
}
- 多个线程可以共享一份 task 代码逻辑
- FutureTask 可以继承其他类
- 有返回值
- 主线程会堵塞
总结
特性 | Thread | Runable | FutureTask |
---|---|---|---|
是否能继承其他类 | 不能 | 能 | 能 |
共享任务代码 | 不能 | 能 | 能 |
有返回值 | 没有 | 没有 | 有 |
会堵塞主线程 | 不会 | 不会 | 会 |