java - 运行 while 语句后结束 Java 线程

标签 java multithreading

我的程序完成后,我在结束线程时遇到问题。我运行一个线程时钟对象,它工作得很好,但我需要在时间“==”一小时似乎工作时结束所有线程我只需要知道如何结束它们。这是我拥有的代码示例,除了在该代码上方定义的一个 int 之外,这是唯一在 run 方法中运行的代码。

    @Override
    public void run()
    {
        int mins = 5;
        while(clock.getHour() != 1)
        {
            EnterCarPark();
            if(clock.getMin() >= mins)
            {
                System.out.println("Time: " + clock.getTime() + " " + entryPoint.getRoadName() + ": " + spaces.availablePermits() + " Spaces");
                mins += 5;
            }
        }
    }

但是,当您继续观察在 netbeans Debug模式下运行的线程时,它们会在一个小时过去后继续运行,但不确定如何解决此问题。我试过中断调用,但它似乎什么也没做。

enter image description here

最佳答案

有两种停止线程的好方法和一种坏方法。

对于所有您需要访问线程的对象(或者在第一种情况下是在该线程上执行的 Runnable 类)。

因此,您的首要任务是确保您可以访问要停止的所有线程的列表。另请注意,在处理多个线程使用的对象时,您需要确保使用线程安全通信!

现在您有以下选择

中断机制

在每个线程上调用 Thread.interrupt()。如果您处于阻塞函数中,这将在线程上抛出 InterruptedException。否则它只会设置 isInterrupted()标志,所以你也必须检查这个。这是一种非常干净且通用的方法,它将尝试中断该线程的阻塞函数。然而很多人不明白如何nicely reactInterruptedException,因此它更容易出现错误。

正在运行标志

在您的线程中有一个 boolean 值“isRunning”。 while 循环调用将此 boolean 值设置为 false 的函数“stopRunning()”。在您的线程中,您会定期读取此 boolean 值并在将其设置为 false 时停止执行。 这个 boolean 值需要是线程安全的,这可以通过将其设为 volatile(或使用 synchronized 锁定)来实现。

当你有一个 Runnable 时,这也很有效,这是目前在线程上运行任务的推荐方式(因为你可以轻松地将 Runnables 移动到 Threadpools

停止线程(邪恶)

第三种邪恶且已弃用的方法是调用Thread.stop() .这是非常不安全的,可能会导致意外行为,请不要这样做!

关于java - 运行 while 语句后结束 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110833/

相关文章:

java - 使用 Java 在文件中打印 132000 行

multithreading - Lparallel.queue 线程安全吗?

java - 正则表达式 - 如果一个字符后跟另一个字符,则只选择一个字符

java - 在 JFrame 的 JPanel 中看不到子 JPanel

android:暂停一个 Activity 直到另一个 Activity 完成

java - 将 FutureTask 转换为 ScheduledFuture

c++ - std::thread 无法在 linux eclipse 上工作

c++ - 一起使用 boost::bind、boost::shared_ptr 和 boost::thread 时不调用复制构造函数

java - 尝试将 spring data mongo 存储库与 Stream 一起使用时出现异常

java - 在目录中查找具有两个关键字之一的文件