Java多線程(二)

來源:互聯網
上載者:User

標籤:setdeamon   建立   imp   jvm   ack   一個   setdaemon   ati   cep   

1.多線程的阻塞狀態

  join()一個線程調用了join()方法,必須等待另一個線程執行完畢後才能執行

package jsontest;public class RunableDemo implements Runnable {    @Override    public void run() {        int i = 0 ;        for(;i<10;i++){            System.out.println("-----------"+Thread.currentThread().getName()+"----"+i);        }    }        public static void main(String[] args) {        RunableDemo d = new RunableDemo() ;        Thread t = new Thread(d) ;        int k = 0 ;        for(;k<10;k++){            System.out.println("---------"+Thread.currentThread().getName()+"----"+k);            if(k==5){                t.start();                try {                    t.join();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}結果:---------main----0---------main----1---------main----2---------main----3---------main----4---------main----5-----------Thread-0----0-----------Thread-0----1-----------Thread-0----2-----------Thread-0----3-----------Thread-0----4-----------Thread-0----5-----------Thread-0----6-----------Thread-0----7-----------Thread-0----8-----------Thread-0----9---------main----6---------main----7---------main----8---------main----9

2.sleep():讓當前的線程暫停指定時間後執行,sleep(1):馬上執行

package jsontest;public class RunableDemo implements Runnable {    @Override    public void run() {        int i = 0 ;        for(;i<10;i++){            System.out.println("-----------"+Thread.currentThread().getName()+"----"+i);        }    }        public static void main(String[] args) {        RunableDemo d = new RunableDemo() ;        Thread t = new Thread(d) ;        int k = 0 ;        for(;k<10;k++){            System.out.println("---------"+Thread.currentThread().getName()+"----"+k);            if(k==5){                t.start();                try {                    Thread.sleep(5000);//thread線程執行完後,過5秒在執行main線程                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}

3.後台線程(Daemon Thread)

  目地:後台線程主要是為其他線程(相對可以稱之為前台線程)提供服務,或“守護線程”。如JVM中的記憶體回收線程。

  生命週期:後台線程的生命週期與前台線程生命週期有一定關聯。主要體現在:當所有的前台線程都進入死亡狀態時,後台線程會自動死亡(其實這個也很好理解,因為後台線程存在的目的在於為前台線程服務的,既然所有的前台線程都死亡了,那它自己還留著有什麼用...偉大啊 ! !)。

  設定後台線程:調用Thread對象的setDaemon(true)方法可以將指定的線程設定為後台線程。

package jsontest;public class RunableDemo implements Runnable {    @Override    public void run() {        int i = 0 ;        for(;i<1000;i++){            System.out.println("-----------"+Thread.currentThread().getName()+"----"+i);        }    }        public static void main(String[] args) {        RunableDemo d = new RunableDemo() ;        Thread t = new Thread(d) ;        int k = 0 ;        for(;k<10;k++){            System.out.println("---------"+Thread.currentThread().getName()+"----"+k);            if(k==5){                t.setDaemon(true);//設定thread線程是後台線程,當前台main線程執行完畢後,後台線程也就跟著結束了                t.start();            }        }    }}

  判斷線程是否是後台線程:調用thread對象的isDeamon()方法。

  註:main線程預設是前台線程,前台線程建立中建立的子線程預設是前台線程,後台線程中建立的線程預設是後台線程。調用setDeamon(true)方法將前台線程設定為後台線程時,需要在start()方法調用之前。前天線程都死亡後,JVM通知後台線程死亡,但從接收指令到作出響應,需要一定的時間。

4.改變線程的優先順序/setPriority():

  每個線程在執行時都具有一定的優先順序,優先順序高的線程具有較多的執行機會。每個線程預設的優先順序都與建立它的線程的優先順序相同。main線程預設具有普通優先順序。  

  設定線程優先順序:setPriority(int priorityLevel)。參數priorityLevel範圍在1-10之間,常用的有如下三個靜態常量值:

  MAX_PRIORITY:10

  MIN_PRIORITY:1

  NORM_PRIORITY:5

  擷取線程優先順序:getPriority()。

  註:具有較高線程優先順序的線程對象僅表示此線程具有較多的執行機會,而非優先執行 

package jsontest;public class RunableDemo implements Runnable {    @Override    public void run() {        int i = 0 ;        for(;i<100;i++){            System.out.println("-----------"+Thread.currentThread().getName()+"----"+i);        }    }        public static void main(String[] args) {        RunableDemo d = new RunableDemo() ;        Thread t = new Thread(d) ;        int k = 0 ;        for(;k<100;k++){            System.out.println("---------"+Thread.currentThread().getName()+"----"+k);            if(k==5){                t.setPriority(Thread.MAX_PRIORITY);                t.start();            }        }    }}

5.線程讓步:yield()

  yield()方法線程優先順序有關,當某個線程調用yiled()方法從運行狀態轉換到就緒狀態後,CPU就緒狀態線程隊列中與該線程優先順序相同或優先順序更高的線程具有較多的執行機會

  

package jsontest;public class RunableDemo implements Runnable {    @Override    public void run() {        int i = 0 ;        for(;i<100;i++){            System.out.println("-----------線程1----"+i);        }    }        public static void main(String[] args) {        RunableDemo d = new RunableDemo() ;        RunableDemo2 r = new RunableDemo2() ;        Thread t = new Thread(d) ;        Thread t2 = new Thread(r) ;        t.setPriority(Thread.MAX_PRIORITY);        t2.setPriority(Thread.MIN_PRIORITY);        int k = 0 ;        for(;k<100;k++){            System.out.println("---------"+Thread.currentThread().getName()+"----"+k);            if(k==20){                t.start();                t2.start();                Thread.yield();            }        }    }}class RunableDemo2 implements Runnable {    @Override    public void run() {        int i = 0 ;        for(;i<100;i++){            System.out.println("--------線程2----"+i);        }            }    }

參考:http://www.cnblogs.com/lwbqqyumidi/p/3817517.html

Java多線程(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.