如何暂停然后恢复一个post?
我声明我读过线程,但我从未使用过。 所以我问你:)
我有两个线程: A
和B
,其中A
管理GUI, B
管理逻辑。
我会从A
开始。
然后当A
绘制GUI时,我会暂停它,等待B
到达X点进入run方法。
当B
到达X点运行方法时,我暂停B
,然后恢复A
A
和B
共享一些变量来管理GUI,逻辑……
我可以做吗? 如果有,怎么样? 🙂
使用wait()和notify()方法:
wait() – 使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。
notify() – 唤醒正在等待此对象监视器的单个线程。
您可以使用Object类的wait
和notify
方法来阻止线程,但要正确起来可能很棘手。 以下是Runnable中无限循环内的示例:
public class Example implements Runnable { private volatile boolean running = true; private volatile boolean paused = false; private final Object pauseLock = new Object(); @Override public void run () { while (running){ synchronized (pauseLock) { if (!running) { // may have changed while waiting to // synchronize on pauseLock break; } if (paused) { try { pauseLock.wait(); // will cause this Thread to block until // another thread calls pauseLock.notifyAll() // Note that calling wait() will // relinquish the synchronized lock that this // thread holds on pauseLock so another thread // can acquire the lock to call notifyAll() // (link with explanation below this code) } catch (InterruptedException ex) { break; } if (!running) { // running might have changed since we paused break; } } } // Your code here } } public void stop() { running = false; // you might also want to interrupt() the Thread that is // running this Runnable, too, or perhaps call: resume(); // to unblock } public void pause() { // you may want to throw an IllegalStateException if !running paused = true; } public void resume() { synchronized (pauseLock) { paused = false; pauseLock.notifyAll(); // Unblocks thread } } };
(有关我们需要在调用wait
和notifyAll
如上所示进行同步的原因的更多信息,请参阅有关该主题的Java教程 。)
如果另一个Thread调用此Runnable的pause()
方法,则运行runnable的Thread将在到达while循环的顶部时阻塞。
请注意,无法在任意点暂停线程。 你需要Thread来定期检查它是否应该暂停并阻塞它自己。
我希望你不需要暂停GUI线程。 操作系统将负责这一点,并且它需要准备好响应以防用户做某事。
另一个想法是确保共享变量在两个线程之间正确同步。 我最近尝试回答了与此有关的问题,请看这里 。
你可以使用CountDownLatch
。 当线程A必须等待线程B时,将调用countDownLatchInstance.await();
当B到达X点时将调用countDownLatchInstance.countDown()
; 允许A继续执行流程。
当你说
A管理GUI
我希望你不要参考UI/Main Thread
,
这就是我让线程等待并通知为我工作的方式:
public class Main { public static void main(String[] args) { final Object lock = new Object(); MyThread t = new MyThread(); t.lock = lock; t.run(); while(true){ try { synchronized (lock) { lock.wait(); } System.out.println("hello"); } catch (InterruptedException e) { e.printStackTrace(); } } }
}
公共类MyThread扩展Thread {
Object lock; @Override public void run(){ JFrame fr = new JFrame("Anothing"); JButton btn = new JButton("Next"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { synchronized (lock) { lock.notify(); } } }); fr.setLayout(new FlowLayout()); fr.add(btn); fr.setSize(400, 400); fr.setVisible(true); }
}
然后,每当我按下按钮时,另一个线程唤醒,执行一轮并等待新的点击。
不推荐使用挂起和恢复线程的java原语。 看看这是为了说明如何实现最佳效果 – http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html检查如何完成相应的暂停和恢复
我应该使用什么而不是
Thread.suspend
和Thread.resume
?与
Thread.stop
,谨慎的方法是让“目标线程”轮询一个变量,指示线程的所需状态(活动或挂起)。 当挂起所需的状态时,线程使用Object.wait
等待。 当线程恢复时,使用Object.notify
通知目标线程。
示例代码在相同的答案中给出,以帮助您实现此目的。