【问题标题】:How to terminate a Thread that wraps a function? [duplicate]如何终止包装函数的线程? [复制]
【发布时间】:2015-03-23 14:48:29
【问题描述】:

我正在做关于线程的课程练习。 我的问题是如何在函数完成时终止包装函数的线程(并获得最大存活时间)并在 java 中返回结果。

这是一个函数的例子:

public static boolean isPrime(long n){
    boolean ans=true; 
    if(n<2)throw new RuntimeException("ERR: the parameter to the isPrime function must be >1 (got "+n+")!");
    int i=2;  double ns=Math.sqrt(n) ;  
    while(i<=ns&&ans){ 
        if (n%i==0) ans=false; 
        i=i+1;  
    }  
    if(Math.random()<Ex4_tester.ENDLESS_LOOP)while(true); 
    return ans;  
}

这是我的代码,我不确定它是否有效:

public class Ex4 {

    private class myThread extends Thread {
        private long n;
        private boolean ans;
        private boolean finish = false;
        public myThread(Long n) {
            this.n = n;
        }

        @Override
        public void run() {
            ans = Ex4_tester.isPrime(n);
            finish = true;
            System.out.println(ans);

        }
    }

    @SuppressWarnings("deprecation")
    public boolean isPrime(long n, double maxTime)  throws RuntimeException, InterruptedException {
        myThread check = new myThread(n);
        check.start();

        try {
            check.join((long)(maxTime * 1000));     
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }

        if ((check.isAlive()) && (check.finish)) {
            check.stop();           
        }
        return check.ans;
    }
}

【问题讨论】:

  • @AlexisKing:我不认为这是一个骗局。这里的 OP 似乎在询问如何在其 run 方法完成时终止线程;所以答案是“你不需要做任何特别的事情,它会自动发生”。
  • @ruakh 是的,你是对的,我误解了这个问题。
  • @ruakh,他在问如何在设定的时间后杀死一个线程,他的代码正在使用已弃用且不安全的 stop() 调用。我认为他正在试图杀死一个线程。
  • 如果你能使用Future,我想你会有更好的运气。

标签: java multithreading join


【解决方案1】:

一种方式,处理InterruptedException,使用Thread.interrupt(),

更多阅读: http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

更多关于在没有 Thread.stop() 的情况下停止线程:

https://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

【讨论】:

  • 如果你中断一个线程,它不会导致InterruptedException,除非线程在一个期望它的方法上被阻塞,例如sleep()
  • @RealSkeptic:是的,这就是教程中提到的中断状态标志的用途。我有一个例子here
猜你喜欢
  • 2021-04-05
  • 2019-07-10
  • 1970-01-01
  • 2019-01-27
  • 2021-12-12
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2015-08-28
相关资源
最近更新 更多