【问题标题】:Is there any technique to force a daemon thread to finish some task if User threads already finished their working?如果用户线程已经完成工作,是否有任何技术可以强制守护线程完成某些任务?
【发布时间】:2012-08-18 04:07:12
【问题描述】:

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

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

【问题讨论】:

  • 你试过Thread.join()吗?
  • 如果您必须等待线程中的某些内容完成,为什么它是守护线程。我会把它变成一个正常的线程。不需要让后台线程成为守护进程。
  • @PeterLawrey 我在守护线程中运行一些无限循环。因此,如果我尝试以正常方式停止应用程序,则如果我使用用户线程则无法停止。我仍然需要在守护进程终止之前完成启动的部分代码。
  • 你可以用一个标志告诉线程优雅地关闭,因为只有他们知道他们什么时候完成了他们需要做的事情。

标签: java multithreading


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您是否查看过 CountDownLatch 或 Cyclic Barrier?

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

      【讨论】:

        【解决方案4】:

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

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

          Runtime.getRuntime().addShutdownHook(new Thread() { 公共无效运行(){数据库。关闭(); } });

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-26
          相关资源
          最近更新 更多