最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程Thread的實現(xiàn)方法代碼詳解

 更新時間:2017年11月30日 15:16:17   作者:中華雪碧  
這篇文章主要介紹了java多線程Thread的實現(xiàn)方法代碼詳解,涉及start(),run(),stop(),interrupt(),isInterrupted(),join()和join(long millis)等方法的介紹,具有一定借鑒價值,需要的朋友可以了解下。

之前有簡單介紹過java多線程的使用,已經(jīng)Thread類和Runnable類,為了更好地理解多線程,本文就Thread進行詳細的分析。

start()

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

使該線程開始執(zhí)行;Java 虛擬機調(diào)用該線程的 run 方法。

結(jié)果是兩個線程并發(fā)地運行;當(dāng)前線程(從調(diào)用返回給 start 方法)和另一個線程(執(zhí)行其 run 方法)。

多次啟動一個線程是非法的。特別是當(dāng)線程已經(jīng)結(jié)束執(zhí)行后,不能再重新啟動。

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

start方法是開啟線程的方法,使用后java會創(chuàng)建一個新的線程執(zhí)行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");

執(zhí)行結(jié)果:
it is over
Thread-1 start
Thread-0 start
Thread-2 start
Thread-0 end
Thread-1 end
Thread-2 end

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

run()

run方法就是調(diào)用Thread設(shè)置的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");

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

stop()

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

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

interrupt()

interrupt的作用是通知線程,你已經(jīng)被中斷的,但具體的中斷執(zhí)行需要在線程自定義處理,甚至你可以不理會繼續(xù)執(zhí)行。具體的中孤單是會線程執(zhí)行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();

執(zhí)行結(jié)果:

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()

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

setPriority(int newPriority)和getPriority()
設(shè)置線程的優(yōu)先級和獲取線程的優(yōu)先級,cpu分配的資源給側(cè)重給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();

執(zhí)行結(jié)果:

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

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

getName()

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

join()和join(long millis)

jion方法的作用是等待線程執(zhí)行完成,join(long millis)可以設(shè)置最長等待時間。比如主線程需要等待子線程完成,獲取子線程的結(jié)果后才能繼續(xù)往下執(zhí)行,這時候就可以使用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執(zhí)行完,再執(zhí)行");

執(zhí)行結(jié)果:

Thread-0 start
Thread-0 t1 end 1001
等待t1執(zhí)行完,再執(zhí)行

總結(jié)

以上就是本文關(guān)于java多線程Thread的實現(xiàn)方法代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。

相關(guān)文章

  • SpringBoot接口限流的實現(xiàn)方法小結(jié)

    SpringBoot接口限流的實現(xiàn)方法小結(jié)

    在一個高并發(fā)系統(tǒng)中對流量的把控是非常重要的,當(dāng)巨大的流量直接請求到我們的服務(wù)器上沒多久就可能造成接口不可用,不處理的話甚至?xí)斐烧麄€應(yīng)用不可用,所以我們需要接口限流,本文給大家介紹了SpringBoot接口限流的實現(xiàn)方法,需要的朋友可以參考下
    2024-10-10
  • Java發(fā)送郵件javax.mail的實現(xiàn)方法

    Java發(fā)送郵件javax.mail的實現(xiàn)方法

    這篇文章主要為大家介紹了Java發(fā)送郵件javax.mail的實現(xiàn)方法,具有一定的參考價值,代碼都有詳細的注釋,感興趣的小伙伴們可以參考一下
    2016-01-01
  • java開發(fā)分布式服務(wù)框架Dubbo服務(wù)引用過程詳解

    java開發(fā)分布式服務(wù)框架Dubbo服務(wù)引用過程詳解

    這篇文章主要為大家介紹了java開發(fā)分布式服務(wù)框架Dubbo服務(wù)引用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Eclipse 開發(fā)java 出現(xiàn)Failed to create the Java Virtual Machine錯誤解決辦法

    Eclipse 開發(fā)java 出現(xiàn)Failed to create the Java Virtual Machine錯誤

    這篇文章主要介紹了Eclipse 開發(fā)java 出現(xiàn)Failed to create the Java Virtual Machine錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 從零到掌握Spring Boot Validation 接口校驗的詳細過程

    從零到掌握Spring Boot Validation 接口校驗的詳細過程

    本文詳細介紹了SpringBoot的Validation接口校驗機制,包括其核心功能、常用注解、自定義校驗、以及實際應(yīng)用場景,通過注解定義數(shù)據(jù)校驗規(guī)則,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • restTemplate未設(shè)置連接數(shù)導(dǎo)致服務(wù)雪崩問題以及解決

    restTemplate未設(shè)置連接數(shù)導(dǎo)致服務(wù)雪崩問題以及解決

    面對線上問題,仔細分析原因,及時調(diào)整配置,能有效解決問題,本文詳細描述了線上遇到流量突增引發(fā)的問題,通過查看代碼和連接池信息,分析出問題的原因是連接池滿了,連接池大小配置不足以應(yīng)對大并發(fā)流量,通過調(diào)整連接池大小配置
    2024-10-10
  • Java Spring框架簡介與Spring IOC詳解

    Java Spring框架簡介與Spring IOC詳解

    Spring 框架是一個輕量級的解決方案,可以一站式地構(gòu)建企業(yè)級應(yīng)用。它是為了解決 企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring 使用基本的 JavaBean 來完成以前只可能由 EJB 完成的事情。IOC 是 Inversion of Control 的縮寫,多數(shù)書籍翻譯成控制反轉(zhuǎn)
    2021-09-09
  • idea向System.getenv()添加系統(tǒng)環(huán)境變量的操作

    idea向System.getenv()添加系統(tǒng)環(huán)境變量的操作

    這篇文章主要介紹了idea向System.getenv()添加系統(tǒng)環(huán)境變量的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring 4.1+JSONP的使用指南

    Spring 4.1+JSONP的使用指南

    在解釋JSONP之前,我們需要了解下”同源策略“,這對理解跨域有幫助?;诎踩脑?瀏覽器是存在同源策略機制的,同源策略阻止從一個源加載的文檔或腳本獲取或設(shè)置另一個源加載額文檔的屬性。說的簡單點就是瀏覽器限制腳本只能和同協(xié)議、同域名、同端口的腳本進行交互。
    2016-04-04
  • SpringBoot使用Minio進行文件存儲的實現(xiàn)

    SpringBoot使用Minio進行文件存儲的實現(xiàn)

    本文主要介紹了SpringBoot使用Minio進行文件存儲的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論

兴安县| 仪征市| 顺平县| 周至县| 喀喇沁旗| 武义县| 大田县| 彰武县| 诏安县| 莆田市| 固镇县| 大丰市| 北辰区| 班玛县| 巴楚县| 永德县| 托克逊县| 嵊泗县| 文化| 尼勒克县| 凤冈县| 汉川市| 敖汉旗| 和平区| 华坪县| 虹口区| 施甸县| 巩义市| 渭南市| 东台市| 华蓥市| 尚义县| 新密市| 册亨县| 永年县| 无锡市| 济宁市| 锡林浩特市| 河北省| 漠河县| 湖口县|