創建線程的方式及實現


1)繼承Thread類創建線程 

1】d定義Thread類的子類,並重寫該類的run()方法,該方法的方法體就是線程需要完成的任務,run()方法也稱為線程執行體。

2】創建Thread子類的實例,也就是創建了線程對象

3】啟動線程,即調用線程的start()方法

代碼實例

public class MyThread extends Thread{//繼承Thread類

  public void run(){

  //重寫run方法

  }

}

public class Main {

  public static void main(String[] args){

    new MyThread().start();//創建並啟動線程

  }

}

2)實現Runnable接口創建線程

1】定義Runnable接口的實現類,一樣要重寫run()方法,這個run()方法和Thread中的run()方法一樣是線程的執行體

2】創建Runnable實現類的實例,並用這個實例作為Thread的target來創建Thread對象,這個Thread對象才是真正的線程對象

3】第三部依然是通過調用線程對象的start()方法來啟動線程

代碼實例:

public class MyThread2 implements Runnable {//實現Runnable接口

  public void run(){

  //重寫run方法

  }

}

public class Main {

  public static void main(String[] args){

    //創建並啟動線程

    MyThread2 myThread=new MyThread2();

    Thread thread=new Thread(myThread);

    thread().start();

    //或者    new Thread(new MyThread2()).start();

  }

}

3)使用Callable和Future創建線程

1】創建Callable接口的實現類,並實現call()方法,然后創建該實現類的實例(從java8開始可以直接使用Lambda表達式創建Callable對象)。

2】使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了Callable對象的call()方法的返回值

3】使用FutureTask對象作為Thread對象的target創建並啟動線程(因為FutureTask實現了Runnable接口)

4】調用FutureTask對象的get()方法來獲得子線程執行結束后的返回值

代碼實例:

public class Main {

  public static void main(String[] args){

   MyThread3 th=new MyThread3();

   //使用Lambda表達式創建Callable對象

     //使用FutureTask類來包裝Callable對象

   FutureTask<Integer> future=new FutureTask<Integer>(

    (Callable<Integer>)()->{

      return 5;

    }

    );

   new Thread(task,"有返回值的線程").start();//實質上還是以Callable對象來創建並啟動線程

    try{

    System.out.println("子線程的返回值:"+future.get());//get()方法會阻塞,直到子線程執行結束才返回

    }catch(Exception e){

    ex.printStackTrace();

   }

  }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM