在我的主程序中,我正在运行 1 个用户线程,它的所有子线程都是守护线程。因此,当用户线程完成其工作时,所有守护线程也会终止。我正在守护线程中执行一些代码块,这些代码块必须在线程终止之前完成。
如果用户线程完成工作,是否可以在守护线程中等待特定的块执行?
在我的主程序中,我正在运行 1 个用户线程,它的所有子线程都是守护线程。因此,当用户线程完成其工作时,所有守护线程也会终止。我正在守护线程中执行一些代码块,这些代码块必须在线程终止之前完成。
如果用户线程完成工作,是否可以在守护线程中等待特定的块执行?
你可以用不同的方式实现这个
首先,如果一个线程确实需要某个代码块来完成执行,那么该线程并不是真正的守护线程。
我认为这取决于您实际想要做什么:
您有一个相当独立的代码块要在关闭之前执行。解决方法:关闭钩子
Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { database.close(); } });
你想优雅地关闭你的线程。解决方案:使用用户线程。打断他们以阻止他们。使用指定的解决方案之一等待。
项目符号 1 更详细:
它基于ReadWriteLock。
// Demon
Lock l = readWriteLock.getReadLock();
l.lock(); // Will wait here if WriteLock is requested
try {
// access the resource protected by this lock
} finally {
l.unlock();
}
// User
Lock l = readWriteLock.getWriteLock();
l.lock(); // Will wait here until all readLock are unlocked
// no need to unlock. Dys anyway
您看过 CountDownLatch 或 Cyclic Barrier 吗?
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html