JAVA編程思想讀書筆記(五)--多線程

來源:互聯網
上載者:User

標籤:group   不能   tar   extend   系統時間   setdaemon   時鐘   waiting   複製   

接上篇JAVA編程思想讀書筆記(四)--對象的複製

No1:

daemon Thread(守護線程)

參考http://blog.csdn.net/pony_maggie/article/details/42441895

daemon是相於user線程而言的,可以理解為一種運行在背景服務線程,比如時鐘處理線程、idle線程、記憶體回收線程等都是daemon線程。

daemon線程有個特點就是"比較次要",程式中如果所有的user線程都結束了,那這個程式本身就結束了,不管daemon是否結束。而user線程就不是這樣,只要還有一個user線程存在,程式就不會退出。

哪些情況要用到它呢?舉個例子,比如記憶體回收線程,我們希望使用者線程存在時,它也存在,但當所有的使用者線程退出時,程式就要退出,記憶體回收線程不要影響退出。如果定義成了使用者線程,那麼只要記憶體回收線程不退出,使用者線程就不會退出,與實際需求不相符。

public class Daemon extends Thread {    private static final int SIZE = 10;    private Thread[] t = new Thread[SIZE];    public Daemon() {        setDaemon(true);        start();    }    @Override    public void run() {        for (int i = 0; i < SIZE; i++) {            t[i] = new DaemonSpawn(i);        }        for (int i = 0; i < SIZE; i++) {            System.out.println("t[" + i + "].isDaemon()=" + t[i].isDaemon());        }        while (true) {            yield();        }    }}
public class DaemonSpawn extends Thread {    public DaemonSpawn(int i) {        System.out.println("DaemonSpwan " + i + " started");        start();    }    @Override    public void run() {        while (true) {            yield();        }    }}

 

public class Daemons {    public static void main(String args[]) {        Thread d = new Daemon();        System.out.println("d.isDaemon()= " + d.isDaemon());        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));        System.out.println("Waiting for CR");        try {            stdin.readLine();        } catch (IOException e) {        }    }}

 

列印結果

d.isDaemon()= trueWaiting for CRDaemonSpwan 0 startedDaemonSpwan 1 startedDaemonSpwan 2 startedDaemonSpwan 3 startedDaemonSpwan 4 startedDaemonSpwan 5 startedDaemonSpwan 6 startedDaemonSpwan 7 startedDaemonSpwan 8 startedDaemonSpwan 9 startedt[0].isDaemon()=truet[1].isDaemon()=truet[2].isDaemon()=truet[3].isDaemon()=truet[4].isDaemon()=truet[5].isDaemon()=truet[6].isDaemon()=truet[7].isDaemon()=truet[8].isDaemon()=truet[9].isDaemon()=true

 

No2:

線程組和線程池的區別?(ThreadGroup / ThreadPool)

  • 線程組:線程組存在的意義,首要原因是安全。java預設建立的線程都是屬於系統線程組,而同一個線程組的線程是可以相互修改對方的資料的。但如果在不同的線程組中,那麼就不能“跨線程組”修改資料,可以從一定程度上保證資料安全。

  • 線程池:線程池存在的意義,首要作用是效率。線程的建立和結束都需要耗費一定的系統時間(特別是建立),不停建立和刪除線程會浪費大量的時間。所以,在建立出一條線程並使其在執行完任務後不結束,而是使其進入休眠狀態,在需要用時再喚醒,那麼 就可以節省一定的時間。如果這樣的線程比較多,那麼就可以使用線程池來進行管理。保證效率。

  • 線程組和線程池共有的特點:1,都是管理一定數量的線程2,都可以對線程進行控制---包括休眠,喚醒,結束,建立,中斷(暫停)--但並不一定包含全部這些操作。

No3:

線程堵塞的原因:

(1)調用sleep(毫秒數),使線程進入”睡眠“狀態。在規定的時間內,這個線程是不會啟動並執行

(2)用suspend()暫停了線程的執行。除非線程收到resume()訊息,否則不會返回“可運行”狀態(這兩個方法都不建議使用了,因為不安全)

(3)用wait()暫停了線程的執行,除非線程收到notify()或者notifyAll()訊息,否則不會變成“可運行”

(4)線程正在等待一些IO(輸入輸出)操作完成

(5)線程試圖調用另一個對象的“同步”方法,但那個對象處於鎖定狀態,暫時無法使用

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.