91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java如何實現多線程Thread

發布時間:2021-07-08 14:25:18 來源:億速云 閱讀:141 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關java如何實現多線程Thread,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

start()

我們先來看看API中對于該方法的介紹:

使該線程開始執行;Java 虛擬機調用該線程的 run 方法。

結果是兩個線程并發地運行;當前線程(從調用返回給 start 方法)和另一個線程(執行其 run 方法)。

多次啟動一個線程是非法的。特別是當線程已經結束執行后,不能再重新啟動。

用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。通過調用Thread類的 start()方法來啟動一個線程,這時此線程處于就緒(可運行)狀態,并沒有運行,一旦得到cpu時間片,就開始執行run()方法,這里方法 run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。

start方法是開啟線程的方法,使用后java會創建一個新的線程執行run里的方法。這是一個小demo:

for(int i=0;i<3;i++){
      Thread t= new Thread(new Runnable() {
        @Override
        public void run() {
      System.out.println(Thread.currentThread().getName()+" start");
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
      System.out.println(Thread.currentThread().getName()+" end");
        }
      });
      t.start();
    }
    System.out.println("it is over");

執行結果:
it is over
Thread-1 start
Thread-0 start
Thread-2 start
Thread-0 end
Thread-1 end
Thread-2 end

由于多線程是有隨機性的,所以每次的結果可能都不一樣,這一點也是我們需要注意的,線程的執行順序和調用順序并不一致。

run()

run方法就是調用Thread設置的Runnable的run方法,將上面的demo進行修改:

for(int i=0;i<3;i++){
      Thread t= new Thread(new Runnable() {
        
        @Override
        public void run() {
      System.out.println(Thread.currentThread().getName()+" start");
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
      System.out.println(Thread.currentThread().getName()+" end");
        }
      });
      t.run();
    }
    System.out.println("it is over");

執行結果:
main start
main end
main start
main end
main start
main end
it is over
run方法的直接結果和start有很大的差別,完全是按順序執行,并沒有開啟新線程。

stop()

stop方法是強制停止線程的執行,是非安全的,不要使用此方法。在調用stop時, 會對鎖定的資源進行釋放,但這種釋放是非一致的,容易引起程序問題。如果想要控制線程的停止,可以使用自定義變量來判斷或者isInterrupted()方法:

class Thread1 extends Thread {
  @Override
  public void run() {
    //判斷線程體是否運行
    while (!isInterrupted()) {
      // Do Something
    }
  }  
}

interrupt()

interrupt的作用是通知線程,你已經被中斷的,但具體的中斷執行需要在線程自定義處理,甚至你可以不理會繼續執行。具體的中孤單是會線程執行join、wait、sleep方法時,拋出InterruptedException。

Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+" start");
            try {
              for(int i=0;i<100000;i++){
                System.out.println(i+"");
                Thread.sleep(1);
              }
            } catch (InterruptedException e) {
              System.out.println("the thread is interrupted");//可以在這里做資源釋放,日志記錄等
              e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+" end");
          }
      });
      t1.start();
      Thread.sleep(100);
      t1.interrupt();

執行結果:

65
66
67
68
the thread is interrupted
java.lang.InterruptedException: sleep interrupted
Thread-0 end
  at java.lang.Thread.sleep(Native Method)
  at com.wk.aqi.act.Test$1.run(Test.java:23)
  at java.lang.Thread.run(Thread.java:745)

isInterrupted()

判斷線程是否中斷,在執行上面的interrupt方法后,會return true。

setPriority(int newPriority)和getPriority()
設置線程的優先級和獲取線程的優先級,cpu分配的資源給側重給priority高的線程。

Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            long t = System.currentTimeMillis();
            System.out.println(Thread.currentThread().getName()+" start");
            for(int i=0;i<1000;i++){
              try {
                Thread.sleep(1);
              } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }
            }
            System.out.println(Thread.currentThread().getName()+" t1 end "+(System.currentTimeMillis()-t));
          }
      });
      Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
          long t = System.currentTimeMillis();
          System.out.println(Thread.currentThread().getName()+" start");
          for(int i=0;i<1000;i++){
            try {
              Thread.sleep(1);
            } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            }
          }
          System.out.println(Thread.currentThread().getName()+" t2 end "+(System.currentTimeMillis()-t));
        }
      });
      t1.setPriority(10);
      t2.setPriority(1);
      t2.start();
      t1.start();

執行結果:

Thread-0 start
Thread-1 start
Thread-0 t1 end 1357
Thread-1 t2 end 1371

在優先級一樣的情況下,t1和t2是幾乎同時完成的,在優先級不一樣的情況,有明顯的差別。

getName()

比較簡單,獲取線程的名稱。

join()和join(long millis)

jion方法的作用是等待線程執行完成,join(long millis)可以設置最長等待時間。比如主線程需要等待子線程完成,獲取子線程的結果后才能繼續往下執行,這時候就可以使用join方法

Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
          long t = System.currentTimeMillis();
          System.out.println(Thread.currentThread().getName()+" start");
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          System.out.println(Thread.currentThread().getName()+" t1 end "+(System.currentTimeMillis()-t));
        }
    });
    t1.start();
    t1.join();
    System.out.println("等待t1執行完,再執行");

執行結果:

Thread-0 start
Thread-0 t1 end 1001
等待t1執行完,再執行

關于“java如何實現多線程Thread”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

民和| 临潭县| 庄河市| 确山县| 留坝县| 唐河县| 浮梁县| 海门市| 太白县| 桂林市| 沧州市| 会东县| 诏安县| 隆昌县| 青铜峡市| 德安县| 凤冈县| 双鸭山市| 宜川县| 长宁县| 黔江区| 揭西县| 津市市| 邯郸县| 崇仁县| 榕江县| 襄垣县| 泰顺县| 吴江市| 民权县| 松江区| 中阳县| 三门峡市| 柳河县| 苗栗市| 渝北区| 密山市| 茂名市| 内黄县| 阜平县| 鹰潭市|