日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Thread——线程

發布時間:2024/9/27 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Thread——线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java線程

  • 1.線程的生命周期
  • 2.新建線程
      • 2.1 通過繼承Thread來創建線程
      • 2.2 通過實現 Runnable 接口來創建線程
      • 2.3 通過實現 Callable 接口來創建線程
  • 3.start、run、join的區別
  • 4.設置優先級

1.線程的生命周期


線程的生命周期分為5各階段:新建、就緒、運行、阻塞、死亡(銷毀)
新建: 創建了線程還未啟動的階段

就緒: 線程處于等待分配CPU來運行的階段

運行: 線程分配到了CPU,處于執行的階段

阻塞: 在運行狀態的時候,可能因為某些原因導致運行狀態的線程變成了阻塞狀態,比如sleep()、wait()之后線程就處于了阻塞狀態,這個時候需要其他機制將處于阻塞狀態的線程喚醒,比如調用notify或者notifyAll()方法。喚醒的線程不會立刻執行run方法,它們要再次等待CPU分配資源進入運行狀態

死亡(銷毀): 線程死亡分為線程正常執行完畢后、線程被提前強制性的終止、出現異常導致線程結束三種

2.新建線程

新建線程有三種方式:

  • 通過繼承 Thread 來創建線程
  • 通過實現 Runnable 接口來創建線程
  • 通過實現 Callable 接口來創建線程
  • 2.1 通過繼承Thread來創建線程

    package thread; class myThread extends Thread{String name;myThread(String name){this.name = name;}public void run() {System.out.println("我是"+this.name+" 的run方法");}} public class thread {public static void main(String[] args) {// TODO 自動生成的方法存根myThread mt1 = new myThread("aaa");myThread mt2 = new myThread("bbb");mt1.start();mt2.start();}}

    2.2 通過實現 Runnable 接口來創建線程

    package thread;class myThread implements Runnable{String name;myThread(String name){this.name = name;}public void run() {System.out.println("我是"+this.name+" 的run方法");}} public class thread {public static void main(String[] args) {// TODO 自動生成的方法存根myThread mt1 = new myThread("aaa");myThread mt2 = new myThread("bbb");new Thread(mt1).start();new Thread(mt2).start();} }

    2.3 通過實現 Callable 接口來創建線程

    import java.util.concurrent.Callable; import java.util.concurrent.FutureTask;class myThread implements Callable<Boolean>{String name;myThread(String name){this.name = name;}public Boolean call() {System.out.println("我是"+this.name+" 的call方法");return true;}} public class thread {public static void main(String[] args) {// TODO 自動生成的方法存根myThread mt1 = new myThread("aaa");myThread mt2 = new myThread("bbb");//使用 FutureTask 類來包裝 Callable 對象,該 FutureTask 對象封裝了該 Callable 對象的 call() 方法的返回值。FutureTask<Boolean> ft1 = new FutureTask<>(mt1);FutureTask<Boolean> ft2 = new FutureTask<>(mt2);new Thread(ft1).start();new Thread(ft2).start();}}


    callable還有一種更復雜的創建方式,也是我剛學習時遇到的

    package thread;import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask;class myThread implements Callable<Boolean>{String name;myThread(String name){this.name = name;}public Boolean call() {System.out.println("我是"+this.name+" 的call方法");return true;}} public class thread {public static void main(String[] args) {// TODO 自動生成的方法存根myThread mt1 = new myThread("aaa");myThread mt2 = new myThread("bbb");//使用 FutureTask 類來包裝 Callable 對象,該 FutureTask 對象封裝了該 Callable 對象的 call() 方法的返回值。 // FutureTask<Boolean> ft1 = new FutureTask<>(mt1); // FutureTask<Boolean> ft2 = new FutureTask<>(mt2); // // new Thread(ft1).start(); // new Thread(ft2).start();//創建執行服務ExecutorService ser = Executors.newFixedThreadPool(2);//提交執行Future<Boolean> f1 = ser.submit(mt1);Future<Boolean> f2 = ser.submit(mt2);//關閉服務ser.shutdown();}}

    建議用第2種創建線程,第一種由于Java是單繼承繼承Thread類后就不能繼承別的類了,而第三種比較復雜。

    3.start、run、join的區別

    start方法:執行start方法后線程的狀態有兩種可能,第一種進入就緒狀態等待分配CPU,第二種直接分配到了CPU進入了運行狀態。
    run方法:執行線程的操作和功能,即Runnable里的run方法。
    join方法:當前執行的A線程暫停,先執行調用join方法的B線程,B線程結束后A線程自動喚醒。

    4.設置優先級

    線程可以通過 setPriority(int) 設置優先級
    參數的取值范圍:1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )

    總結

    以上是生活随笔為你收集整理的Thread——线程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。