WEB开发网
开发学院软件开发Java 如何停止java线程 阅读

如何停止java线程

 2010-01-18 00:00:00 来源:WEB开发网   
核心提示: *当wait方法被调用,*当被I/O阻塞,如何停止java线程(2),可能是文件或者网络等等,当线程处于上述的状态时,但是Windows上面不会有这种异常,所以,使用前面介绍的方法就不可用了,这个时候

*当wait方法被调用。

*当被I/O阻塞,可能是文件或者网络等等。

当线程处于上述的状态时,使用前面介绍的方法就不可用了。这个时候,我们可以使用interrupt()来打破阻塞的情况,如:

public void stop() {
        Thread tmpBlinker = blinker;
        blinker = null;
        if (tmpBlinker != null) {
           tmpBlinker.interrupt();
        }
    }

当interrupt()被调用的时候,InterruptedException将被抛出,所以你可以再run方法中捕获这个异常,让线程安全退出:

try {
   ....
   wait();
} catch (InterruptedException iex) {
   throw new RuntimeException("Interrupted",iex);
}

阻塞的I/O

当线程被I/O阻塞的时候,调用interrupt()的情况是依赖与实际运行的平台的。在Solaris和Linux平台上将会抛出InterruptedIOException的异常,但是Windows上面不会有这种异常。所以,我们处理这种问题不能依靠于平台的实现。如:

package com.cnblogs.gpcuster
import java.net.*;
import java.io.*;
public abstract class InterruptibleReader extends Thread {
    private Object lock = new Object( );
    private InputStream is;
    private boolean done;
    private int buflen;
    protected void processData(byte[] b, int n) { }
    class ReaderClass extends Thread {
        public void run( ) {
            byte[] b = new byte[buflen];
            while (!done) {
                try {
                    int n = is.read(b, 0, buflen);
                    processData(b, n);
                } catch (IOException ioe) {
                    done = true;
                }
            }
            synchronized(lock) {
                lock.notify( );
            }
        }
    }
    public InterruptibleReader(InputStream is) {
        this(is, 512);
    }
    public InterruptibleReader(InputStream is, int len) {
        this.is = is;
        buflen = len;
    }
    public void run( ) {
        ReaderClass rc = new ReaderClass( );
        synchronized(lock) {
            rc.start( );
            while (!done) {
                try {
                    lock.wait( );
                } catch (InterruptedException ie) {
                    done = true;
                    rc.interrupt( );
                    try {
                        is.close( );
                    } catch (IOException ioe) {}
                }
            }
        }
    }
}

Tags:如何 停止 java

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接