如果用户线程已经完成工作,是否有任何强制守护程序线程完成某项任务的技术?

时间:2012-08-17 18:34:36

标签: java multithreading

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

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

4 个答案:

答案 0 :(得分:2)

您可以实现这种不同的方式

  1. 使用Thread.join();
  2. 使用Observer-Observable模式
  3. 使用CountDownLatch

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

答案 3 :(得分:1)

我认为这取决于你真正想做的事情:

  1. 你想避免恶魔线程在关键部分内关闭。 解决方案:恶魔线程在此部分中获取读锁定,并且用户线程必须在死亡之前获取写锁定。
  2. 在关闭之前,您有一个相当独立的代码块。 解决方案:关闭挂钩

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

  3. 您希望优雅地关闭线程。解决方案:使用用户线程。中断他们阻止他们。使用其中一个指定的解决方案等待。

  4. 子弹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