如何暂停运行线程并在需要时重新启动相同的线程?

时间:2014-01-11 09:42:05

标签: java thread-safety

我想暂停通过迭代消息列表在文件中写消息的线程。当消息列表为空时,我希望线程停止,并在列表中的消息时恢复线程。

我知道停止,暂停(),恢复方法已被弃用,但如果线程持续在后台,它会消耗cpu。我做了很多谷歌搜索,但找不到合适的答案。请任何人帮助我

这是我的代码:

 private Thread mFileWriterThread = new Thread() {

    @Override
    public synchronized void run()         {
        while (mIsRunning) {
            synchronized (mMessageList) {
                Iterator it = mMessageList.iterator();
                while ((it.hasNext())) {
                    String message = (String) it.next();
                    writeToFile(fileOutputStream, message);
                    mMessageList.remove(message);

                }
            }
        }
    }

};

2 个答案:

答案 0 :(得分:3)

这就是BlockingQueue的存在。它有一个take()方法,强制一个线程阻塞,直到一个Object可用。您的问题可以通过简单的生产者 - 消费者设计来解决。

我在这里粘贴了一个取自Oracle示例的最小片段:

class Producer implements Runnable {
   private final BlockingQueue queue;
   Producer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { queue.put(produce()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   Object produce() { ... }
 }

 class Consumer implements Runnable {
   private final BlockingQueue queue;
   Consumer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { consume(queue.take()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   void consume(Object x) { ... }
 }

当然,Consumer和Producer必须以某种方式共享队列(只是将它传递给构造函数,如示例中所示)。

答案 1 :(得分:0)

您想使用wait()来创建线程块*。然后调用notify()再次唤醒线程。谷歌的“java等待通知”会给你一个教程。

*阻止此处意味着在不使用任何资源的情况下等待,直到另一个线程将其唤醒。