<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之旅 廣告
                # JAVA之旅(十五)——多線程的生產者和消費者,停止線程,守護線程,線程的優先級,setPriority設置優先級,yield臨時停止 * * * > 我們接著多線程講 ## 一.生產者和消費者 > 什么是生產者和消費者?我們解釋過來應該是生產一個,消費一個,的意思,具體我們通過例子來說 ~~~ package com.lgl.hellojava; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * 生產者和消費者 */ Resrource res = new Resrource(); Produce pro = new Produce(res); Consumer con = new Consumer(res); Thread t1 = new Thread(pro); Thread t2 = new Thread(con); t1.start(); t2.start(); } } // 資源 class Resrource { private String name; private int count = 1; private boolean flag = false; // 生產 public synchronized void set(String name) { if (flag) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 每次設置添加編號 this.name = name + "-" + count++; System.out.println(Thread.currentThread().getName() + "--生產者--" + this.name); flag = true; this.notify(); } } // 消費 public synchronized void out() { if (!flag) try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "--消費者--" + this.name); flag = false; this.notify(); } } // 生產 class Produce implements Runnable { private Resrource res; public Produce(Resrource res) { this.res = res; } @Override public void run() { while (true) { System.out.println("Android"); } } } // 消費 class Consumer implements Runnable { private Resrource res; public Consumer(Resrource res) { this.res = res; } @Override public void run() { while (true) { res.out(); } } } ~~~ > 當我們生產一個,消費一個,就具有多線程的特性,如果出現其他現象,那就說明你的線程存在安全隱患了 ## 二.停止線程 > 怎么讓線程停?你會想到stop方法 ![這里寫圖片描述](http://img.blog.csdn.net/20160607214403658) > 既然已過時,我們就的去想其他辦法了,跟其原理,是什么?run方法結束就是線程停止,那怎么讓run方法結束? * 只要控制循環,就可以讓run方法結束,也就是線程的結束 > 我們寫個實例 ~~~ package com.lgl.hellojava; import org.omg.CORBA.FloatHolder; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * 線程停止 */ stopThread s = new stopThread(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); t1.start(); t2.start(); int num = 0; while (true) { if (num++ == 60) { s.changeFlag(); break; } else { System.out.println(Thread.currentThread().getName() + "Main run"); } } } } class stopThread implements Runnable { private boolean flag = true; @Override public void run() { while (flag) { System.out.println(Thread.currentThread().getName() + "Thread run"); } } public void changeFlag() { flag = false; } } ~~~ > 邏輯十分簡單,只要達到要求,就停止,但是還有一種特殊情況,當線程處于凍結狀態,就不會讀取到標記,那線程就不會結束,我們看 ~~~ package com.lgl.hellojava; import org.omg.CORBA.FloatHolder; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * 線程停止 */ stopThread s = new stopThread(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); t1.start(); t2.start(); int num = 0; while (true) { if (num++ == 60) { s.changeFlag(); break; } else { System.out.println(Thread.currentThread().getName() + "Main run"); } } } } class stopThread implements Runnable { private boolean flag = true; @Override public synchronized void run() { while (flag) { try { wait(); } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName() + "InterruptedException run"); } System.out.println(Thread.currentThread().getName() + "Thread run"); } } public void changeFlag() { flag = false; } } ~~~ > 這樣就循環了。而在我們多線程中,提供了一個中斷的方法Interupted ## 三.守護線程 > 守護線程其實也是Interupted中的東西,我們來看 ![這里寫圖片描述](http://img.blog.csdn.net/20160607222859345) > 你只要在啟動線程前調用就可以了,就標記成了守護線程,就是一個依賴關系,你在我在,你不在我也不在; ## 四.Join方法 > 這個也是一個方法,意思是等待線程終止 ![這里寫圖片描述](http://img.blog.csdn.net/20160608204155299) > 我們倒是可以寫個小例子 ~~~ package com.lgl.hellojava; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * Join */ Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); try { // t1要申請加入到運行中來 t1.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t2.start(); for (int i = 0; i < 100; i++) { System.out.println("miam" + i); } System.out.println("main over"); } } class Demo implements Runnable { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "=---" + i); } } } ~~~ > 我們可以滿足條件下 ,臨時加入一個線程 > > 當A線程執行到了B線程的join方法時,A線程就會等待,等B線程都執行完,A才會執行,A可以用來臨時加入線程執行。 ## 五.線程的優先級 > 線程有優先級,默認的優先級都是5,這個是可以改變的,t1.setPriority(優先級); ![這里寫圖片描述](http://img.blog.csdn.net/20160608212535646) > 我們可以拿上面的例子來做個比較 ~~~ package com.lgl.hellojava; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * Join */ Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); //權限雖然高,只是頻率高而已 t1.setPriority(Thread.MAX_PRIORITY); t2.start(); for (int i = 0; i < 100; i++) { System.out.println("miam" + i); } System.out.println("main over"); } } class Demo implements Runnable { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "=---" + i); } } } ~~~ > 我們這里還有一個小方法yield,臨時停止的意思,我們可以看例子 ~~~ package com.lgl.hellojava; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * Join */ Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); t2.start(); for (int i = 0; i < 100; i++) { // System.out.println("miam" + i); } System.out.println("main over"); } } class Demo implements Runnable { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "=---" + i); Thread.yield(); } } } ~~~ > 我們可以看到 ![這里寫圖片描述](http://img.blog.csdn.net/20160608213244961) > 主線程并沒有運行,那就對了,因為暫停了 > > 我們到這里,本篇就結束了,同時線程所講的知識也講完了,線程博大精深,很值得我們學習,我所講的,仍然只是一些皮毛罷了,希望大家多用心研究一下 ### 我的群555974449也可以歡迎各位來討論 版權聲明:本文為博主原創文章,博客地址:http://blog.csdn.net/qq_26787115,未經博主允許不得轉載。
                  <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>

                              哎呀哎呀视频在线观看