我用以下调节锁的方法:

while(!hasPerformedAction()){
    //wait for the user to perform the action
    //can add timer here too
}

setHasPerformedAction(false);

return getActionPerfomed();

这基本上等待用户执行一个动作,然后返回。目前的东西要求的一个回答来自用户在继续之前,这就是为什么我等到输入时被接收的。但是我想知道如果这是效率低下和如果我们正在等待一段时间(即<=30秒)将它拖慢的电脑运行这个程序。是否有任何其他替代品使用这种方法,即锁、信号灯所以如果有什么法?

谢谢,

Aly

有帮助吗?

解决方案

事实上,这不仅效率低下,它甚至没有保证工作,因为没有"发生之前的"边缘的代码表示。创建一个 发生之前的边缘 你需要做的之一:

  1. 访问的挥发性可变的
  2. 同步,在一个共享的资源
  3. 使用一个并发的工具锁。

正如另一评论, 最简单的 解决方案,只是确保你的标志是一种挥发性可变的,而只是扔一个短暂的睡在你的循环。

然而,最好的事情要做的就是同步/等待/通知在一个共同变量。

该方法,你需要读了是 等等通知.为了更好地说明如何使用这些读 这篇文章.一个例子代码段是下文所示;

1线

Object shared = new Object();
startThread2(shared);
synchronized (shared) {
  while (taskNotDone())
    shared.wait();
}

2线

// shared was saved at the start of the thread
// do some stuff
markTaskAsDone();
synchronized (shared) {
  shared.notify();
}

其他提示

您已经写了叫忙循环,你不应该做的事情。

您可能希望继续这样做,但至少睡了一下,以不繁忙的循环,这仍然不会是很大的:

while( !hasPerformedAction() ) {
    (sleep a bit here)
}

另一种方式来做到这一点会入队一个阻塞队列中的用户操作:那么你可以简单地使用的 queue.take 的和队列执行会照顾这个问题为您<。 / p>

和另一种方式是使用一个回调被通知的用户操作。

Java教程对在Java并发一个很好的教训:

http://java.sun.com/docs/books/教程/本质/并发/

如果你打算从另一个线程修改UI,你会想记住的事:

SwingUtils.invokeLater(actionToInvoke);

有一个<大骨节病> GUI 在你的标签,所以我会假设动作在GUI中完成的。

在“建议”的方式做这种事情是主线程使自己进入睡眠(可能使用wait()),并为GUI操作,一旦已经执行的动作,以notify()它放回清醒。

有一些类对于在java.util.concurrent.locks。看看类LockSupport

问候麦克

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top