Two-Phase Termination Pattern 所有參予者 :
* TerminationRequester (送出終止請求的對象) 參予者 :
* Terminator 參予者 :
範例程序 :
在這裡要寫的 Two-Phase Termination Pattern 範例程序, 會有一條線程每隔約 500ms 將計數器加一, 而我們約會在 5秒後結束該線程.
* 類別 CountupThread :
CountupThread 是一條會不斷遞增數值的線程. counter 成員變量表是計數器, 代碼如下 :
- package dp.thread.ch10;
- public class CountupThread extends Thread{
- private long counter = 0; //計數器
- private volatile boolean shutdownRequested = false; // 已經送出終止請求則為 true
- public void shutdownRequest(){
- shutdownRequested = true;
- interrupted();
- }
- public boolean isShutdownRequested(){
- return shutdownRequested;
- }
- public final void run(){
- try{
- while(!isShutdownRequested()) {
- doWork();
- }
- }catch(InterruptedException ioe) {
- ioe.printStackTrace();
- }finally{
- doShutdown();
- }
- }
- private void doWork() throws InterruptedException {
- counter++;
- System.out.println("doWork: counter= "+counter);
- Thread.sleep(500);
- if(counter>10000) {
- doShutdown();
- }
- }
- private void doShutdown(){
- System.out.println("doShutdown: counter= "+counter);
- }
- }
Main 類會啟動 CountupThread 線程並約在 5秒後調用shutdownRequest 停止該線程, 代碼如下 :
- package dp.thread.ch10;
- public class Main {
- public static void main(String args[]) {
- System.out.println("main: BEGIN");
- try{
- CountupThread t = new CountupThread();
- t.start(); //啟動線程
- Thread.sleep(5000);
- System.out.println("main: shutdownRequest");
- t.shutdownRequest(); // 對線程送出終止請求
- System.out.println("main: join");
- t.join(); //等待t線程結束.
- }catch(InterruptedException ioe) {
- ioe.printStackTrace();
- }
- System.out.println("main: END");
- }
- }
執行結果 :
補充說明 :
@. 不可以使用 Thread 類的 stop 方法: java.lang.Thread 類有一個用來強制結束掉線程的stop 方法. 但是現在stop 已經不被建議使用 (depreciated). 原因是 stop 方法會使實例喪失安全性的保障. 使用 stop 方法時, 線程會拋出 java.lang. ThreadDeath 異常而馬上結束. 即使線程再執行某些 critical process. 請參考如下代碼 :
- class Position {
- private int x;
- private int y;
- public synchronized void setXY(int newX,int newY) {
- x = newX;
- y = new Y;
- }
- }
@. join 方法與 isAlive方法: 等待指定的線程結束時, 要使用 join 方法, 另外檢查指定的線程現在是否結束了, 可以使用 java.lang.Thread 的 isAlive 方法. 若返回值是true, 該線程還活著. 如果是 false, 表示該線程已經結束了
沒有留言:
張貼留言