<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 線程設置名字 建議對每個線程啟動之前進行定義,不建議啟動后和為不同線程設置重名 可以使用Thread類的下面的方法 * 構造方法: `public Thread(Runnable target, String name);` * 設置名字: `public final void setName(String name);` * 取得名字: `public final String getName();` * 取得當前線程對象: `public static Thread currentThread();` 如果在實例化Thread類對象時候沒有設置名字,那么會自動進行編號命名,保證不重復 # 線程的休眠 休眠方法 ~~~ public static void sleep(long millis) throws InterruptedException ~~~ 會拋出一個中斷異常 ~~~ Thread.sleep(2000); ~~~ # 線程的優先級 優先級越高,越有可能先執行,只是大概率先執行,并不是一定 在Thread類提供 ~~~ * 設置優先級: public final void setPriority(int newPriority); * 取得優先級: public final int getPriority(); ~~~ 發現設置和取得優先級都是使用了int數據類型,對于此內容有三種取值: ~~~ * 最高優先級: public static final int MAX_PRIORITY; //10 * 中等優先級: public static final int NORM_PRIORITY; //5 * 最低優先級: public static final int MIN_PRIORITY; //1 ~~~ 例子 ~~~ Thread thread1 = new Thread(task1, "task1線程"); Thread thread2 = new Thread(task2, "task2線程"); thread1.setPriority(Thread.MAX_PRIORITY); thread1.setPriority(Thread.MIN_PRIORITY); thread1.start(); thread2.start(); ~~~ 主線程的優先級是多少? ~~~ public static void main(String[] args) { System.out.println(Thread.currentThread().getPriority()); //5,中等 } ~~~ # yield休眠當前線程 休眠當前線程, 是線程編程可執行狀態,以便其他相同優先級的線程有機會執行, 使當前線程從執行狀態(運行狀態)變為可執行態(就緒狀態)。cpu會從眾多的可執行態里選擇,也就是說,當前也就是剛剛的那個線程還是有可能會被再次執行到的,并不是說一定會執行其他線程而該線程在下一次中不會執行到了。 注意: 再次執行調度程序決定的, 可以立刻會再次執行。。。 yield會釋放資源鎖嗎? yield不會釋放資源所,當暫停后,等待調度程序再次調用,走完同步區域代碼后才釋放鎖 ~~~ package com.study; public class Test01 implements Runnable { private String name; public Test01(String name) { this.name = name; } @Override public synchronized void run() { System.out.println(name + "-> start"); for (int i = 0; i < 1000; i++) { if (i % 2 == 0) { Thread.yield(); } System.out.println(Thread.currentThread().getName() + " --- i = " + (i)); } System.out.println(name + "-> stop"); } public static void main(String[] args) { Test01 a = new Test01("A"); Thread thread1 = new Thread(a); Thread thread2 = new Thread(a); Thread thread3 = new Thread(a); thread1.start(); thread2.start(); thread3.start(); } } ~~~ # join線程之間的并行執行變為串行執行 ~~~ public final void join(long millis) throws InterruptedException public final void join(long millis, int nanos) throws InterruptedException public final void join() throws InterruptedException ~~~ Thread類中的join方法的主要作用就是同步,它可以使得線程之間的并行執行變為串行執行。 join的意思是使得放棄當前線程的執行,并返回對應的線程 ~~~ package com.study; public class Test01 { public static void main(String[] args) throws InterruptedException { ThreadJoinTest t1 = new ThreadJoinTest("小明"); ThreadJoinTest t2 = new ThreadJoinTest("小冬"); t1.start(); /** * 程序在main線程中調用t1線程的join方法,則main線程放棄cpu控制權,并返回t1線程繼續執行直到線程t1執行完畢 * 所以結果是t1線程執行完后,才到主線程執行,相當于在main線程中同步t1線程,t1執行完了,main線程才有執行的機會 */ t1.join(); t2.start(); } } class ThreadJoinTest extends Thread { public ThreadJoinTest(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(this.getName() + "---" + i); } } } ~~~ 上面程序結果是先打印完小明線程,在打印小冬線程;   上面注釋也大概說明了join方法的作用:在A線程中調用了B線程的join()方法時,表示只有當B線程執行完畢時,A線程才能繼續執行。注意,這里調用的join方法是沒有傳參的,join方法其實也可以傳遞一個參數給它的,具體看下面的簡單例子: ~~~ package com.study; public class Test01 { 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線程之間執行順序由串行執行變為普通的并行執行 */ t1.join(10); t2.start(); } } class ThreadJoinTest extends Thread { public ThreadJoinTest(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(this.getName() + "---" + i); } } } ~~~ 上面代碼結果是:程序執行前面10毫秒內打印的都是小明線程,10毫秒后,小明和小冬程序交替打印。 所以,join方法中如果傳入參數,則表示這樣的意思:如果A線程中掉用B線程的join(10),則表示A線程會等待B線程執行10毫秒,10毫秒過后,A、B線程并行執行。需要注意的是,jdk規定,join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時間,直到B線程執行完畢,即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); } } } ~~~ 上面代碼執行結果是:小明和小東線程交替打印。 所以得到以下結論:join方法必須在線程start方法調用之后調用才有意義。這個也很容易理解:如果一個線程都沒有start,那它也就無法同步了。 **join方法實現原理** 有了上面的例子,我們大概知道join方法的作用了,那么,join方法實現的原理是什么呢? **其實,join方法是通過調用線程的wait方法來達到同步的目的的。例如,A線程中調用了B線程的join方法,則相當于A線程調用了B線程的wait方法,在調用了B線程的wait方法后,A線程就會進入阻塞狀態,具體看下面的源碼**: ~~~ 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; } } } ~~~ 從源碼中可以看到:join方法的原理就是調用相應線程的wait方法進行等待操作的,例如A線程中調用了B線程的join方法,則相當于在A線程中調用了B線程的wait方法,當B線程執行完(或者到達等待時間),B線程會自動調用自身的notifyAll方法喚醒A線程,從而達到同步的目的。 # isAlive是否處于活動狀態 方法isAlive()功能是判斷當前線程是否處于活動狀態。 活動狀態就是線程啟動且尚未終止,比如正在運行或準備開始運行。 ~~~ package com.study; class IsAliveThread extends Thread { public IsAliveThread() { System.out.println("begin"); System.out.println( Thread.currentThread().getName() + "- status -" + Thread.currentThread().isAlive()); System.out.println("end"); } @Override public void run() { System.out.println("run begin"); System.out.println( Thread.currentThread().getName() + "- status -" + Thread.currentThread().isAlive()); System.out.println("run end"); } } public class Test01 { public static void main(String[] args) { IsAliveThread ist = new IsAliveThread(); Thread th = new Thread(ist); System.out.println("Main begin th isAlive = " + th.isAlive()); th.start(); System.out.println("Main end th isAlive = " + th.isAlive()); } } ~~~ ## 3個線程按順序執行 T3先執行,在T3的run中,調用t2.join,讓t2執行完成后再執行t3 在T2的run中,調用t1.join,讓t1執行完成后再讓T2執行 ~~~ package testThread; import java.util.Date; public class TestThread { //現在有T1、T2、T3三個線程,你怎樣保證T2在T1執行完后執行,T3在T2執行完后執行 public static void main(String[] args) { //線程1 final Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("t1"); } }); //線程2 final Thread t2 = new Thread(new Runnable() { @Override public void run() { try { //引用1線程,等待t1線程執行完 t1.join(); } catch (Exception e) { e.printStackTrace(); } System.out.println("t2"); } }); //線程3 final Thread t3 = new Thread(new Runnable() { @Override public void run() { try { //引用2線程,等待t2線程執行完 t2.join(); } catch (Exception e) { e.printStackTrace(); } System.out.println("t3"); } }); //這3個線程啟動沒有先后順序 t3.start(); t2.start(); t1.start(); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看