java - 优雅地结束基于控制台的多线程程序

标签 java multithreading

我有下面的类,我通常运行大约 10 个线程

public class MyClass implements Runnable {    
  private volatile Device device = null;

  public MyClass(Device device) {
    this.device = device;
  }

  @Override
  public void run() {
    while (true) {  // <--- I do know that the "true" has to be changed to a Boolean
      try {
        Worker worker = new Worker();
        worker.work();
        System.out.println("Waiting 6 seconds!");
        Thread.sleep(6 * 1000);
        System.out.println("------------------------------------");
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    System.out.println("Thread in program ended!");
  }
}

在我的 main 中,我是这样开始线程的

for (int i = 0; i < 2; i++) {
  (new Thread(new MyClass())).start();
}

这是一个基于控制台的程序。结束程序最可靠的方法是什么?我认为最好的方法是将 while (true) 更改为 while (Boolean) 并以某种方式更改所有线程的 boolean 值,然后当循环结束时,程序将优雅地结束。

最佳答案

这里我通过等待用户输入来结束它,但您可以将其更改为从任何地方触发停止方法

    public static void main(String[] args) {

    List<MyClass> myThreads = new ArrayList<>();
    for (int i = 0; i < 2; i++) {
        MyClass myClass = new MyClass();
        Thread t = new Thread(myClass);
        t.start();
        myThreads.add(myClass);
    }
    Scanner in = new Scanner(System.in);
    in.next();

    for(MyClass t : myThreads){
        t.stop();
    }

}

class MyClass implements Runnable {

private Boolean flag;

public MyClass() {
    this.flag = true;
}

@Override
public void run() {
    while (flag) {  // <--- I do know that the "true" has to be changed to a Boolean
        try {
            System.out.println("Waiting 6 seconds!");
            Thread.sleep(6 * 1000);
            System.out.println("------------------------------------");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    System.out.println("Thread in program ended!");
}

public void stop(){
    this.flag = false;
} }

关于java - 优雅地结束基于控制台的多线程程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49950639/

相关文章:

java - 为什么不能设置随机颜色?

c# - Threading、Winforms、将TCP操作与主窗口窗体分离

java - 产生 5 万个线程的可扩展性指南

java - Java中如何判断一个线程是否已经启动?

java - 如果 Java 的 parseInt 对于有效的 IEEE-754 二进制文件失败,那么哪个 API 不会失败?

java - 如何在 Java 中复制 PostgreSQL 的 uuid_generate_v3()?

java - 为什么 Canvas 窗口不显示?

java - Spring MVC - HTTP 状态 500

c++ - std::condition_variable::wait 是如何实现的?

visual-studio-2008 - VS2008 在遇到断点时暂停所有线程