如何杀死从第三方lib导入的线程?

时间:2014-07-08 02:22:41

标签: java multithreading

我在项目中导入第三方库,现在我们在Websphere上发布它(我使用 ServletContextListener 来清理我应用程序中的所有步骤,使用 Thread.stop( )方法),但每次我们重新部署这个应用程序时,我发现旧线程仍然存在,我在互联网上搜索,并知道它应该使用voilate成员或使用 interrupt(),但是我不想破解第三方库,那么谁可以给我一个提示呢? 谢谢:)
第三方lib代码如下:

public void run() {
      while (true) {
            try {
                for (DefaultFuture future : FUTURES.values()) {
                    if (future == null || future.isDone()) {
                        continue;
                    }
                    if (System.currentTimeMillis() - future.getStartTimestamp() > future.getTimeout()) {
                        // create exception response.
                        Response timeoutResponse = new Response(future.getId());
                        // set timeout status.
                        timeoutResponse.setStatus(future.isSent() ? Response.SERVER_TIMEOUT : Response.CLIENT_TIMEOUT);
                        timeoutResponse.setErrorMessage(future.getTimeoutMessage(true));
                        // handle response.
                        DefaultFuture.received(future.getChannel(), timeoutResponse);
                    }
                }
                Thread.sleep(30);
            } catch (Throwable e) {
                logger.error("Exception when scan the timeout invocation of remoting.", e);
            }
        }
    }

我做了一个简单的本地测试,发现 thread.stop()可以停止线程,并使用本地jetty,我可以重现问题,谁能解释一下呢?


我的本地测试代码:

public class Test {
public static void main(String[] args) throws InterruptedException, IOException {
    myThread t1 = new myThread();
    t1.start();
    Thread.sleep(4000);
    t1.stop();
    System.in.read();
}

}

class myThread extends Thread{
@Override
public void run() {
    int i=0;
    while(true){
        try {
            System.out.println(i++);
            Thread.sleep(30);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}

}

1 个答案:

答案 0 :(得分:1)

不推荐使用stop方法。这是不安全的。您应该阅读Oracle教程 - Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.

参见段落:

  

我应该使用什么而不是Thread.stop?例如,假设你的   applet包含以下启动,停止和运行方法:

private Thread blinker;

public void start() {
    blinker = new Thread(this);
    blinker.start();
}

public void stop() {
    blinker.stop();  // UNSAFE!
}

public void run() {
    while (true) {
        try {
            Thread.sleep(interval);
        } catch (InterruptedException e){
        }
        repaint();
    }
} 
     

您可以通过将applet的stop和run方法替换为以下内容来避免使用Thread.stop:       private volatile Thread blinker;

public void stop() {
    blinker = null;
}

public void run() {
    Thread thisThread = Thread.currentThread();
    while (blinker == thisThread) {
        try {
            Thread.sleep(interval);
        } catch (InterruptedException e){
        }
        repaint();
    }
}

为什么不扩展第三方类,并重新编写线程方法?