怎么在java中使用join線程

本篇文章給大家分享的是有關怎么在java中使用join線程,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯建站網站建設提供從項目策劃、軟件開發(fā),軟件安全維護、網站優(yōu)化(SEO)、網站分析、效果評估等整套的建站服務,主營業(yè)務為網站制作、網站建設,成都app軟件開發(fā)公司以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。創(chuàng)新互聯建站深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

一、作用

Thread類中的join方法的主要作用就是同步,它可以使得線程之間的并行執(zhí)行變?yōu)榇袌?zhí)行。具體看代碼:

public class JoinTest {
  public static void main(String [] args) throws InterruptedException {
    ThreadJoinTest t1 = new ThreadJoinTest("小明");
    ThreadJoinTest t2 = new ThreadJoinTest("小東");
    t1.start();
    /**join的意思是使得放棄當前線程的執(zhí)行,并返回對應的線程,例如下面代碼的意思就是:
     程序在main線程中調用t1線程的join方法,則main線程放棄cpu控制權,并返回t1線程繼續(xù)執(zhí)行直到線程t1執(zhí)行完畢
     所以結果是t1線程執(zhí)行完后,才到主線程執(zhí)行,相當于在main線程中同步t1線程,t1執(zhí)行完了,main線程才有執(zhí)行的機會
     */
    t1.join();
    t2.start();
  }
}
class ThreadJoinTest extends Thread{
  public ThreadJoinTest(String name){
    super(name);
  }
  @Override
  public void run(){
    for(int i=0;i<1000;i++){
      System.out.println(this.getName() + ":" + i);
    }
  }
}

上面程序結果是先打印完小明線程,在打印小東線程;

上面注釋也大概說明了join方法的作用:在A線程中調用了B線程的join()方法時,表示只有當B線程執(zhí)行完畢時,A線程才能繼續(xù)執(zhí)行。注意,這里調用的join方法是沒有傳參的,join方法其實也可以傳遞一個參數給它的,具體看下面的簡單例子:

public class JoinTest {
  public static void main(String [] args) throws InterruptedException {
    ThreadJoinTest t1 = new ThreadJoinTest("小明");
    ThreadJoinTest t2 = new ThreadJoinTest("小東");
    t1.start();
    /**join方法可以傳遞參數,join(10)表示main線程會等待t1線程10毫秒,10毫秒過去后,
     * main線程和t1線程之間執(zhí)行順序由串行執(zhí)行變?yōu)槠胀ǖ牟⑿袌?zhí)行
     */
    t1.join(10);
    t2.start();
  }
}
class ThreadJoinTest extends Thread{
  public ThreadJoinTest(String name){
    super(name);
  }
  @Override
  public void run(){
    for(int i=0;i<1000;i++){
      System.out.println(this.getName() + ":" + i);
    }
  }
}

上面代碼結果是:程序執(zhí)行前面10毫秒內打印的都是小明線程,10毫秒后,小明和小東程序交替打印。

所以,join方法中如果傳入參數,則表示這樣的意思:如果A線程中掉用B線程的join(10),則表示A線程會等待B線程執(zhí)行10毫秒,10毫秒過后,A、B線程并行執(zhí)行。需要注意的是,jdk規(guī)定,join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時間,直到B線程執(zhí)行完畢,即join(0)等價于join()。

二、join與start調用順序問題

上面的討論大概知道了join的作用了,那么,入股 join在start前調用,會出現什么后果呢?先看下面的測試結果

public class JoinTest {
  public static void main(String [] args) throws InterruptedException {
    ThreadJoinTest t1 = new ThreadJoinTest("小明");
    ThreadJoinTest t2 = new ThreadJoinTest("小東");
    /**join方法可以在start方法前調用時,并不能起到同步的作用
     */
    t1.join();
    t1.start();
    //Thread.yield();
    t2.start();
  }
}
class ThreadJoinTest extends Thread{
  public ThreadJoinTest(String name){
    super(name);
  }
  @Override
  public void run(){
    for(int i=0;i<1000;i++){
      System.out.println(this.getName() + ":" + i);
    }
  }
}

上面代碼執(zhí)行結果是:小明和小東線程交替打印。

所以得到以下結論:join方法必須在線程start方法調用之后調用才有意義。這個也很容易理解:如果一個線程都沒有start,那它也就無法同步了。

三、join方法實現原理

有了上面的例子,我們大概知道join方法的作用了,那么,join方法實現的原理是什么呢?

其實,join方法是通過調用線程的wait方法來達到同步的目的的。例如,A線程中調用了B線程的join方法,則相當于A線程調用了B線程的wait方法,在調用了B線程的wait方法后,A線程就會進入阻塞狀態(tài),具體看下面的源碼:

public final synchronized void join(long millis)
  throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;
    if (millis < 0) {
      throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
      while (isAlive()) {
        wait(0);
      }
    } else {
      while (isAlive()) {
        long delay = millis - now;
        if (delay <= 0) {
          break;
        }
        wait(delay);
        now = System.currentTimeMillis() - base;
      }
    }
  }

Java的優(yōu)點是什么

1. 簡單,只需理解基本的概念,就可以編寫適合于各種情況的應用程序;2. 面向對象;3. 分布性,Java是面向網絡的語言;4. 魯棒性,java提供自動垃圾收集來進行內存管理,防止程序員在管理內存時容易產生的錯誤。;5. 安全性,用于網絡、分布環(huán)境下的Java必須防止病毒的入侵。6. 體系結構中立,只要安裝了Java運行時系統,就可在任意處理器上運行。7. 可移植性,Java可以方便地移植到網絡上的不同機器。8.解釋執(zhí)行,Java解釋器直接對Java字節(jié)碼進行解釋執(zhí)行。

以上就是怎么在java中使用join線程,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯行業(yè)資訊頻道。

名稱欄目:怎么在java中使用join線程
網頁地址:http://bm7419.com/article36/iehhpg.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站收錄、全網營銷推廣、服務器托管、網站排名、自適應網站、定制網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

搜索引擎優(yōu)化