標籤: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編程思想讀書筆記(五)--多線程