当前位置: 首页 > 面试题库 >

停止Java中的循环线程

慕容典
2023-03-14
问题内容

我正在使用从队列中连续读取的线程。

就像是:

public void run() {
    Object obj;
    while(true) {
        synchronized(objectsQueue) {
            if(objectesQueue.isEmpty()) {
                try {
                    objectesQueue.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                obj = objectesQueue.poll();
            }
        }

        // Do something with the Object obj
    }
}

停止此线程的最佳方法是什么?

我看到两个选择:

1-由于Thread.stop()已弃用,因此我可以实现stopThisThread()使用原子检查条件变量的方法。

2-将死亡事件对象或类似的对象发送到队列。当线程获取死亡事件时,它退出。

我更喜欢第一种方法,但是,我不知道何时调用该stopThisThread()方法,因为可能有某种方法进入队列,并且停止信号可能首先到达(这是不希望的)。

有什么建议?


问题答案:

DeathEvent(或因为它是常说,“毒丸计划”)的做法效果很好,如果你要在关闭之前完成队列上的所有工作。问题是这可能需要很长时间。

如果您想尽快停止,建议您这样做

BlockingQueue<O> queue = ...

...

public void run() {
   try {
       // The following test is necessary to get fast interrupts.  If
       // it is replaced with 'true', the queue will be drained before
       // the interrupt is noticed.  (Thanks Tim)
       while (!Thread.interrupted()) {
           O obj = queue.take();
           doSomething(obj);
       }
   } catch (InterruptedException ex) {
       // We are done.
   }
}

要停止t使用该run方法实例化的线程,只需调用t.interrupt();

如果将上面的代码与其他答案进行比较,您会注意到如何使用BlockingQueueThread.interrupt()简化html" target="_blank">解决方案。

我还要声称,stop不需要多余的标志,并且从总体上看可能有害。行为良好的工作线程应尊重中断。意外中断只是意味着该工作程序正在原始程序员无法预期的环境中运行。最好的事情是,如果工人去做被告知要做的事情,即应该停止……这是否符合原始程序员的构想。



 类似资料:
  • 问题内容: 这可能是我误读了我所读内容的一种情况,但是在Java中杀死线程的所有示例似乎都表明您必须发出信号以杀死自己。您不能在没有严重风险的情况下从外面杀死它。问题是,所有有关如何“礼貌地”要求线程死亡的示例都有某种循环,因此您要做的就是观察每次迭代中的标志。 因此,我得到的是一个线程,该线程执行的操作仅需要一段时间(一系列SQL查询)。我当然可以在每个步骤之后进行检查,但是它们并没有处于循环中

  • 所以这是我需要解决的大事。我有Visual C#应用程序。在这个应用程序中,用户输入数据并单击Execute。当他们点击执行时,核心方法开始在新线程中,在那个线程和方法是一个循环。不断地使用方法调用器,我向UserForm发送更新,循环实际上在做什么。例如,像这样,我在每个cicle中更新progressBar。

  • 问题内容: 我正在编写一段连接到服务器的代码,使用该连接会生成一堆线程并执行一堆“工作”。 在某些情况下,连接失败,我需要停止所有操作并从头开始创建新对象。 我想在对象之后进行清理,但在线程上调用thread.stop,但是此方法似乎已被弃用。 推荐的替代方法是什么?是否应该为每个线程编写自己的清理和退出方法?将线程设置为null?或者是其他东西? 问题答案: 看这里 : 在HowToStopAT

  • 我正试图按照下面的代码读取一个txt文件: 我的txt文件如下所示: 当我不使用变量I时,仅用于在控制台打印我的文件,我的代码可以完美地工作。你们能帮我吗?如何将每个数据分离到数组中?我是Java初学者。

  • 我的情况是,我用移位寄存器控制72个LED。可通过特定请求激活每个LED。很容易将LED设置为高,但LED应闪烁。通过“for”使LED闪烁不是问题。我设法使LED闪烁,一旦它闪烁,当新的请求进来时,它不会停止。LED应仅在新请求到达之前闪烁。 我的问题是,如果在闪烁的过程中(在示例中3次)我不能停止它。如果我正在发送一个新的

  • 我正在尝试创建一个自动打开我的在线类的脚本。我写了这样的代码: 现在,问题是第一个if语句被无休止地执行,我想让它只执行一次,而不是等到现在==lesson2再执行第二个if etc