NPr*_*sad 5 java multithreading countdownlatch
我使用a CountDownLatch来处理两个Java线程.我的班级结构如下:
MainClass.java
ThreadOne.java
ThreadTwo.java
MainClass:
CountDownLatch latch = new CountDownLatch(2);
Thread thread = new Thread(new ThreadOne(latch));
thread.start();
Thread thread1 = new Thread(new ThreadTwo(latch));
thread1.start();
latch.await(20, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
主类等待其他两个线程完成其工作.一旦他们完成工作,它就不会等到超时值(20秒).我的问题是,如果任何线程被破坏或损坏,那么CountDownLatch等待其超时值.有没有办法忽略那个被打断的线程并继续前进而不等待20秒?
zapl绝对正确!主线程正在等待超时结束.如果在主线程在锁存器上等待的时间内进行了线程转储,您将看到如下内容:
"main" #1 prio=5 os_prio=31 tid=0x00007fa4be002000 nid=0x1303 waiting on condition [0x000000010b74c000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000076abcb598> (a java.util.concurrent.CountDownLatch$Sync)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:277)
Run Code Online (Sandbox Code Playgroud)
来自Javadoc await:
如果当前计数大于零,则当前线程将被禁用以进行线程调度,并且在发生以下三种情况之一之前处于休眠状态:
- 由于countDown方法的调用,计数达到零; 要么
- 其他一些线程会中断当前线程; 要么
- 指定的等待时间过去了.
在您的情况下,await调用仅因为3)而返回.
在CountDownLatchJavadoc中,对countDown()方法的调用应该在finally块中完成:
public void run() {
try {
startSignal.await();
doWork(); // may throw exception
} catch (InterruptedException ex) {
// handle interruption ...
} finally {
doneSignal.countDown(); // cause await to return asap
}
}
Run Code Online (Sandbox Code Playgroud)