1

在我的主程序中,我正在运行 1 个用户线程,它的所有子线程都是守护线程。因此,当用户线程完成其工作时,所有守护线程也会终止。我正在守护线程中执行一些代码块,这些代码块必须在线程终止之前完成。

如果用户线程完成工作,是否可以在守护线程中等待特定的块执行?

4

4 回答 4

2

你可以用不同的方式实现这个

  1. 使用 Thread.join();
  2. 使用 Observer-Observable 模式
  3. 使用 CountDownLatch
于 2012-08-17T18:45:27.190 回答
1

首先,如果一个线程确实需要某个代码块来完成执行,那么该线程并不是真正的守护线程。

但是,要完成您的要求,您可以让主线程通过Thread#join()等待守护线程

于 2012-08-17T18:37:22.440 回答
1

我认为这取决于您实际想要做什么:

  1. 您希望避免恶魔线程在关键部分内被关闭。解决方案:恶魔线程在本节中获取读锁,而用户线程必须在死亡前获取写锁。
  2. 您有一个相当独立的代码块要在关闭之前执行。解决方法:关闭钩子

    Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { database.close(); } });

  3. 你想优雅地关闭你的线程。解决方案:使用用户线程。打断他们以阻止他们。使用指定的解决方案之一等待。

项目符号 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
于 2012-08-17T19:01:01.500 回答
1

您看过 CountDownLatch 或 Cyclic Barrier 吗?

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

于 2012-08-17T18:39:13.347 回答