如何在Java中停止线程?

Yat*_*oel 2 java multithreading

我用GUI创建了一个java程序,我想要一个停止按钮功能,当用户点击停止按钮时,必须停止程序.

  1. 在我的程序中,主线程启动其他10个线程,我希望每当单击停止按钮时,必须在主线程之前停止所有10个线程.

  2. 其次,我还希望每当这10个线程中的任何线程被停止时,它必须首先关闭它之前打开的所有资源,比如连接到数据库等.

我已经实现了代码........

现在有一个问题.

我的线程类是这样的:

public class ParserThread implements Runnable {
    private volatile boolean stopped = false;

    public void stopTheThread() {
        stopped = true;
    }
    :
    :
}
Run Code Online (Sandbox Code Playgroud)

以下是从函数start()启动10个线程的主线程

public class Main() {
    Thread [] threads;

    public void start() {
        for(int i = 0; i < 10; i++) {
            threads[i] = new Thread(new ParserThread());
        }       
    }

    public void stop() {
        // code to stop all the threads
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想调用ParserThread的stop方法来设置"stopped = true"来停止线程.我想要为所有10个线程完成这件事.

我该如何调用stop方法.我希望它在Main类的stopAllThreads()方法中完成.

Jon*_*eet 8

一般来说,这样做的方法是让每个其他线程定期检查一个标志.通常后台线程循环,等待工作 - 他们只需要在每次循环时检查标志.如果他们正在使用Object.wait()或类似的东西被告知有更多的工作,应该使用相同的通知来表明该线程也应该停止.(不要只是旋转,直到你停止 - 这将吸收CPU.不要只是使用睡眠 - 这将延迟终止.)

这允许所有线程干净地终止,适当地释放资源.IMO,其他选项如interrupt()和被弃用的destroy()方法更难以正确控制.(中断线程比硬中断更好,但它有一系列问题 - 例如中断只在某些点处理.)

编辑:在代码中,它看起来像:

// Client code
for (Task task : tasks) {
  task.stop();
}

// Threading code
public abstract class Task implements Runnable {

  private volatile boolean stopped = false;

  public void stop() {
    stopped = true;
  }

  protected boolean shouldStop() {
    return stopped;
  }

  public abstract void run();
}
Run Code Online (Sandbox Code Playgroud)

然后你的任务将继承Task.如果您希望该stop()方法也通知监视器,则需要使其稍微复杂一些,但这是基本的想法.

示例任务:

public class SomeTask extends Task {
  public void run() {
    while (!shouldStop()) {
      // Do work
    }
  }
}
Run Code Online (Sandbox Code Playgroud)