如何暂停然后恢复一个post?

我声明我读过线程,但我从未使用过。 所以我问你:)

我有两个线程: AB ,其中A管理GUI, B管理逻辑。

我会从A开始。

然后当A绘制GUI时,我会暂停它,等待B到达X点进入run方法。

B到达X点运行方法时,我暂停B ,然后恢复A

AB共享一些变量来管理GUI,逻辑……

我可以做吗? 如果有,怎么样? 🙂

使用wait()和notify()方法:

wait() – 使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。

notify() – 唤醒正在等待此对象监视器的单个线程。

您可以使用Object类的waitnotify方法来阻止线程,但要正确起来可能很棘手。 以下是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 } } }; 

(有关我们需要在调用waitnotifyAll如上所示进行同步的原因的更多信息,请参阅有关该主题的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.suspendThread.resume

Thread.stop ,谨慎的方法是让“目标线程”轮询一个变量,指示线程的所需状态(活动或挂起)。 当挂起所需的状态时,线程使用Object.wait等待。 当线程恢复时,使用Object.notify通知目标线程。

示例代码在相同的答案中给出,以帮助您实现此目的。