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( );
}