0
public class Ex4 extends Thread {
  boolean ans;
  boolean change=false;

  public boolean isPrime(long n, double maxTime) throws RuntimeException {
    final Thread a;
    Thread b;
    final RuntimeException e;
    final long num = n ;
    final double mtime = maxTime;
    a = new Thread(){
        public void run(){
                try{
                    ans = Ex4_tester.isPrime(num);
                    change=true;
                }
                catch ( RuntimeException exp){
                    throw exp;
                };
            }
    };
    a.start();
    try {
        sleep((long)mtime);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }
    if(a.isAlive()){
        a.interrupt();
    }
    if(a.isInterrupted()){
        throw new RuntimeException("time for check exceeded");
    }
    return ans;
  }
}

一切正常,除了有时 Ex4_tester.isPrime 进入无限循环(没关系,它应该这样做)。即使线程被中断进程继续运行并且线程实际上并没有停止的问题

4

5 回答 5

2

线程被中断并不会停止它。它只是导致线程退出某些等待和睡眠状态。要让线程根据来自另一个线程的输入退出无限循环,请对循环中的 Atomic<> 进行显式检查,并让控制线程将原子变量的状态修改为线程“a”将退出循环的位置。

于 2013-01-14T21:09:02.807 回答
1

只有某些方法Object.wait()会抛出InterruptedException。如果您的线程不调用任何这些方法,它就不会被中断。

换句话说,您不能异步中断 Java 线程。很少有线程系统支持异步中断。

于 2013-01-14T21:06:59.127 回答
0

最简单的方法是将您的线程设置为守护进程,即a.setDaemon(true)在启动前调用。如果这只是保持启动的线程,那将使您的进程结束。

如果您想中断线程,请阅读此文档以了解中断方法

于 2013-01-14T21:09:17.733 回答
0

中断需要在设计上可以安全地中断线程的点进行显式检查。如果您不执行此检查(或调用执行此检查的方法),线程将继续运行。

于 2013-01-14T21:18:26.460 回答
0

interrupt方法InterruptedException仅在线程处于某些执行点(例如sleep)时才会导致。您的代码包含无效的取消政策。您应该考虑另一种停止线程的方法。

于 2013-01-14T21:10:15.773 回答