1.第一種方式:繼承Thread類,重寫run方法 :(這種方法不是很建議使用因為java隻支援單繼承)。
public class Time extends Thread {
//重寫run方法
public void run(){
}
public static void main(String[] args) {、
//運作線程 不能直接調用run不然就是方法
new Time().start();
}
}
2:第二種方式:實作實作Runable接口,重寫run方法:
public class Time implements Runnable {
@Override
public void run() {
System.out.println("12345");
}
public static void main(String[] args) {
var Time= new Time();
new Thread(Time,"定義線程的名字").start();
}
}
3:第三種方式:實作Callable接口要實作call方法:
public class Time implements Callable {
//重寫call方法
@Override
public Object call() throws Exception {
System.out.println("我是實作多線程的第三種方式");
return null;
}
public static void main(String[] args) {
Callable a=new Time();
//利用FutureTask用來包裝一個 Callable 因為這個類實作了Runnable方法
FutureTask i=new FutureTask(a);
Thread t=new Thread(i);
t.start();
}
}
最後總結:Thread和Runable都是重寫了run方法;但java隻支援但繼承 是以繼承Thread類就不能繼承其他類了。
但Runable很好的解決了這個問題因為java中接口支援多繼承。這兩個都是沒有傳回值的。
Callable接口的實作是将call方法實作然後把Callable封裝成FutureTask(這個類可以判斷線程執行完畢還是取消執行)
這三種方式都是通過Thread的start()方法開啟。
這三種方式都可以說本質上都是Runable實作因為
1:Thread實作了Runable;
2:Callable是通過封裝成FuntureTask,FutureTask 可以用來包裝一個 Callable 或是一個runnable對象。
因為FurtureTask實作了Runnable方法。
是以可以說本質是由Runable實作;