Java 线程可以中断自己吗?

Java 线程可以中断自己吗?,java,multithreading,Java,Multithreading,我想问一个线程是否有可能自行结束。我在线程实例中有一个方法,它检查int是否溢出,但它不是run()方法。如果internalSteps达到Integer.MAX\u VALUE/numberOfAllThreads,我想停止线程 private void addInternalStep() { ++internalSteps; if( internalSteps == (Integer.MAX_VALUE / numberOfAllThreads) ) {

我想问一个线程是否有可能自行结束。我在线程实例中有一个方法,它检查int是否溢出,但它不是run()方法。如果internalSteps达到Integer.MAX\u VALUE/numberOfAllThreads,我想停止线程

    private void addInternalStep() {
    ++internalSteps;
    if( internalSteps == (Integer.MAX_VALUE / numberOfAllThreads) ) {
        System.out.println("Thread stopped. In danger of overflow.");
        this.interrupt(); // Not stopping the thread
    }
}

@Override
public void run() {

    while( !isInterrupted() ) {

            if(Math.pow(Math.random(), 2) + Math.pow(Math.random(), 2) < 1) {
                hits = hits.add(BigDecimal.ONE);
            }
            counter = counter.add(BigDecimal.ONE);
            addInternalStep();
    }
}
private void addInternalStep(){
++内部步骤;
if(internalSteps==(Integer.MAX_值/numberOfAllThreads)){
System.out.println(“线程停止,有溢出的危险”);
this.interrupt();//不停止线程
}
}
@凌驾
公开募捐{
而(!isInterrupted()){
if(Math.pow(Math.random(),2)+Math.pow(Math.random(),2)<1){
hits=hits.add(BigDecimal.ONE);
}
计数器=计数器.add(BigDecimal.ONE);
addInternalStep();
}
}

为什么这个.interrupt()不起作用?如何在线程自身的实例中中断线程

调用中断只设置一个标志,它没有任何其他效果

线程可以自己调用中断。当线程捕获InterruptedException并希望恢复引发异常时清除的标志时,可能会发生这种情况

这通常看起来像:

try {
    Thread.sleep(1000L);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt():
}
但这是唯一一次有意义的特例


使用currentThread方法确保中断调用作用于当前执行的线程,而不管代码如何执行

线程中断自己是没有意义的。中断只是另一个线程的一种方式,表示它希望一个线程停止它正在做的事情;由被中断的线程检查中断,并自行停止。线程对自己这样做没有任何意义:它可以停止它正在做的事情。请注意,调用
this.interrupt()
表示您正在扩展线程,而您可能应该调用
thread(Runnable)
。还要记住,线程不一定是在自身上运行的(信不信由你):线程实现Runnable,因此实际上可以将一个线程传递给另一个线程运行,而应该中断的是“另一个线程”。