Thread programming in Java is very EEEEEASY ! 範例參考: http://www.csie.nctu.edu.tw/~tsaiwn/oop/java/03_sample_JavaPrograms/ 子目錄: 20_tea/ 和 21_network/ Java 的 Thread 有兩種寫法: (1) 若你的 class 沒有 extends 別的 class 建議用這招: class any_name extends Thread { //... constructor(s) if you want public void run( ) { //... } //... }// class 使用該 Thread: any_name gg = new any_name( ); gg.start( ); // concurrent running (2) 若你的 class 已經 extends 別的 class, 則只能這樣: class any_name implements Runnable { //... constructor(s) if you want public void run( ) { //... } //... }// class 使用該 Thread: any_name yy = new any_name( ); // 生出 Runnable 物件 Thread gg = new Thread(yy); // 把它包成 Thread 物件 gg.start( ); // concurrent running ========================================== *** 等待某 Thread gg 完成: (會合) gg.join( ); 注意 join( ) 可能會丟出 Exception, 所以若沒有處理則 compile 就不會過! 用騙的就可: try { gg.join( ); } catch(Exception e) {;} *** stop( ) 會有問題所以已經是 deprecated 建議要改為在 thread class 內設一個變數, 主僕都要看得見, 主僕: 若 gg 是 Thread 物件, 則執行 gg.start( ) 的那程式就是主 (當然也是一個 thread); 因為 gg.start( ) 而跑起來的 thread 就是 僕 :-) 要做出 stop( )的效果, 就是由"主"把該主僕都看得見的變數改為叫僕去死! "僕" thread 須三不五時就要看看該變數, 看是否"主"要它死, 若是, 則應該 return 以便結束該 Thread. *** 如何解決 Critical section的 mutual exclusive ? 有兩種方法: (1) 在函數名稱左方寫 synchronized 這樣使得整個 function 都在 critical section 內! 注意, 同一個 class 內所有的 synchronized function 形成critical section (2) 使用 synchronized(物件變數) { ... } 例如: String haha = "hehehe"; synchronized(haha) { // critical section } 注意, 對同一個物件 synchronized 的 block (區塊) 算在同一critical section *** suspend( ) 和 resume( ) 也是 deprecated, 須用別的方法做: 可以仿照上述 stop( ), 在 thread class 內有個主僕共用變數, 另外再隨便弄個主僕都看得見的物件變數, 例如 String haha="hehehe"; "主" 希望 "僕" 暫停就把該變數設成某特定值, "僕" 發現 主人要其 suspend 阿就執行 haha.wait( ); "主" 希望該僕 resume( ) 就做: (a) 改該主僕共用變數為正常值, (b) haha.notify( ); ** 注意 wait( ) 可能會丟出 Exception, 所以若沒有處理則 compile 就不會過! ** 再注意 wait( ) 與 notify( ) 是針對某物件變數 (例如此例的 haha ) ** 再再注意: wait( ) 和 notify( ) 都必須在 synchronized Block 內, 且 synchronized( ) 括號內的物件變數必須與 wait( ), notify( ) 用的同! 否則雖 compile 會過, 執行時會當掉! 例如要像這樣: synchronized(haha) { //.. haha.notify( ); }