如何在处于等待状态的Java中停止线程?

时间:2018-08-23 21:46:36

标签: java multithreading

假设我有一个名为T1的线程正在持有锁,而其他线程T2T3T4正在等待锁。现在,我想停止线程T2,但是其他线程T3T4应该仍在等待。我该如何实现?

2 个答案:

答案 0 :(得分:0)

您可以从interrupt()中使用Thread Class方法,像这样

public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(someTask());
    t.start();     
    Thread.sleep(3_000);    
    t.interrupt();  
    t.join(1_000); 
}
private static Runnable someTask() {
    return () -> {
        for (int i = 0; i < 10; i++) {
            System.out.print(i);     
            try {
                Thread.sleep(1_000);  
            } catch (InterruptedException e) {
                break;                
            }
        }
    };
}

答案 1 :(得分:0)

您应该做的是利用T2.interrupt()。中断将唤醒相应的线程并抛出该线程必须处理的InterruptionException。从这里,您可以结束线程。下面让我们看一下T2可能的Runnable的{​​{1}}方法的简短示例。

run()

如果有另一个线程,可以说public void run() { while (true) { try { doNonBlockingWork(); // Random code logic doBlockingWork(); // Where the thread will attempt to get and wait for the lock doMoreCode(); // Will never get here if interrupt is called while waiting for lock above } catch (InterruptedException e){ Thread.currentThread().interrupt(); // Maintain Interrupt Status break; // Finish } } } 线程执行以下代码,

main

public void killSpecificThread() { doMyLogic(); startThreads(); // All the threads begin T2.interrupt(); doMoreLogic(); } 将被唤醒(如果它处于唤醒状态,则工作原理相同,只是没有唤醒步骤),并立即被抛出T2。由于上面的try catch,我们可以通过完成InterruptionException方法来处理它。