Abr*_*itu 7 java multithreading
我正在使用以这种方式执行的while循环创建一个程序:
这是一个例子:
while(path != null);
Run Code Online (Sandbox Code Playgroud)
类中还有另一个函数将路径设置为null,一旦发生这种情况,主线程就应该退出这个循环.另一个函数在另一个线程中调用.
但是,即使path设置为null,主线程也不会退出循环.有什么建议?
码:
try
{
for (Node n:realpath)
{
Thread.sleep(100);
actor.walk(n);
}
Thread.sleep(100);
}
catch (InterruptedException ex)
{
Logger.getLogger(VNScreen.class.getName()).log(Level.SEVERE, null, ex);
}
realpath.clear();
path = null;
if(path == null)
System.out.println("NULLED PATH");
Run Code Online (Sandbox Code Playgroud)
Ted*_*opp 13
忙碌的等待是非常昂贵的.我这样做:
Object LOCK = new Object(); // just something to lock on
synchronized (LOCK) {
while (path != null) {
try { LOCK.wait(); }
catch (InterruptedException e) {
// treat interrupt as exit request
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当您设置path为null时,只需调用
synchronized (LOCK) {
LOCK.notifyAll();
}
Run Code Online (Sandbox Code Playgroud)
(this如果两段代码都在同一个对象中,您可以同步.)
您可以使用CountDownLatch,而不是使用低级别的等待/通知方法,并且避免使用 volatile 忙于等待。因为只有一个事件可以预期,所以将闩锁实例化为:
CountDownLatch latch = new CountDownLatch(1);
Run Code Online (Sandbox Code Playgroud)
替换while (path != null)为:
latch.await();
Run Code Online (Sandbox Code Playgroud)
在您的主代码中,只需执行以下操作:
path = somePath;
latch.countDown();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8035 次 |
| 最近记录: |