多线程模式(七)Two-phase Termination

1 引言

       如何终止执行中的线程?
      
线程运行阶段时,在送出停止线程的请求时,不应慌慌张张马上终止目前的工作,而是先完成这一周期的工作。然后,进入善后阶段完成一些善后工作,如,关闭文档或网络串流。
      
终止运行阶段,完成善后阶段,完整的完成线程的工作。


    以 Java Thread �K止而言,不建�h您直接使用 stop() 方法�斫K止�绦芯w, stop() 方法���G出 ThreadDeath 例外��迫�绦芯w�K止,即使�绦芯w正在�\作�A段或�绦兄� synchronized �^,如果您要�K止�绦芯w,建�h自行��作,例如:
  public class SomeThread extends Thread {
    private boolean isTerminated = false;

    public void terminate() {
        isTerminated = true;
    }

    public void run() {
        while(!isTerminated) {
            // ... some statements
        }
    }
 }
 
    
考�]到有�r�绦芯w可能���绦兄�sleep() wait() 而�M入Not Runnable ��B,使用上面的方法可能��延�t�K止的�求,因而可以在要求�K止�r再呼叫 interrupt() 方法,�@���G出 InterruptedException ,而使得�绦芯w�� Not Runnable ��B中�x�_,因此可以改�一下程式:
 public class SomeThread extends Thread {
    private boolean isTerminated = false;

    public void terminate() {
        isTerminated = true;
        interrupt();
    }

    public void run() {
        try {
            while(!isTerminated) {
                // ... some statements
            }
        }
        catch(InterruptedException e) {
        }
    }
 }
 
    
在�l出中止�求之後,如果�绦芯w是在 Not Runnable ��B,���G出 InterruptedException ,如果�@��例外�]有先被捕捉,就��被 run() 中的 catch InterruptedException 捕捉,也就是�f��直接�x�_ while �圈,因而如果您在�l出�K止�求後,要求先�绦型赀@一���L期的工作,您要先 捕捉�@��例外,若不用完成�@一���L期的工作,�t不用捕捉�@��例外,要如何作取�Q於您的程式。

    
如果�绦芯w要完成�@一���L期的工作,在下一���L期�_始之前�z查旗�耍��@�r它的�Y果是 false ,所以�x�_ while �圈,�@�r候您可以�M行一些善後工作,�@��可以��在 finally �^�K中,例如:
 public class SomeThread extends Thread {
    private boolean isContinue = false;

    public void terminate() {
        isTerminated = true;
        interrupt();
    }

    private void doWorkBeforeShutdown() {
        // .... do some work before shutdown
    }

    public void run() {
        try {
            while(!_isTerminated) {
                // ... some statements
            }
        }
        catch(InterruptedException e) {
        }
        finally {
            doWorkBeforeShutdown();
        }
    }
 }
 
    
上面�@��程式大致上就是 Two-phase Termination 模式的架��,另外如果您的�绦芯w�服�罩�其它的物件,�t在送出�K止�求到完全�K止之前,���停止服�掌渌�物件,您可以�其它物件要 求服�罩�前,先查��绦芯w是否已被要求�K止,�@可以藉由提供一��方法�磉_到:
 public class SomeThread extends Thread {
    private boolean isTerminated = false;

    public void terminate() {
        isTerminated = true;
        interrupt();
    }

    public boolean isTerminated() {
        return _isTerminated;
    }

    private void doWorkBeforeShutdown() {
        // .... do some work before shutdown
    }

    public void run() {
        try {
            while(!_isTerminated) {
                // ... some statements
            }
        }
        catch(InterruptedException e) {
        }
        finally {
            doWorkBeforeShutdown();
        }
    }
 }

你可能感兴趣的:(职场,休闲)