停止线程列表

tyb*_*900 4 java swing multithreading java-threads

我有一个线程数组列表,如果从 GUI 按下取消按钮,我想停止列表中的所有线程。有没有办法阻止所有这些线程?

List<Thread> threads = new ArrayList<>();
EncryptThread encryptThread = null;
for(int j=0;j<fileEncrytionList.size();j++){
    encryptThread = new EncryptThread();
    encryptThread.setFilePath(fileEncrytionList.get(j));
    encryptThread.setOutPutFile(fileName);
    Thread t = new Thread(encryptThread);
    t.start();
    threads.add(t); 
}

if(cancel button pressed) // stop all threads from arraylist
Run Code Online (Sandbox Code Playgroud)

Pet*_*ček 9

线程取消是 Java 中的一项协作任务 - 需要对线程进行编程以响应某种取消信号。两种最常见的方法是:

  1. 中断。有一种Thread#interrupt()方法是大多数对取消敏感的 JDK 方法使用的方法。例如,大多数阻塞方法将检测中断。有没有见过InterruptedException,例如来自Thread.sleep()?就是这样!该sleep()方法是阻塞的,可能会长时间运行,并且可以取消。如果线程在睡眠时被中断,它将被唤醒并抛出一个InterruptedException.

    收到中断信号后,任务应该停止它正在做的事情并抛出一个InterruptedException你可以在上层捕获的东西,沿着“关闭,再见!”的行记录一些东西,理想情况下重新中断线程并让它死亡。如果您在线程中编写了一些阻塞任务,检查Thread.interrupted()是处理取消的一种方法。

  2. 一只旗。如果您的线程在循环中重新执行一些重复性工作,则该循环可以更改为:

    private volatile boolean shouldContinue = true;
    
    @Override
    public void run() {
        while (shouldContinue) {
            // ...do work.
        }
    }
    
    public void cancelPlease() {
        shouldContinue = false;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    ...或类似的规定。

一般信息是 - 您的可运行对象需要知道它们是可取消的,并且它们需要合作。无论您做什么,都不要调用该Thread#stop()方法。