天天看點

java多線程實作的三種方式

      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實作;