Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果用户线程已经完成了工作,是否有任何技术可以强制守护进程线程完成某些任务?_Java_Multithreading - Fatal编程技术网

Java 如果用户线程已经完成了工作,是否有任何技术可以强制守护进程线程完成某些任务?

Java 如果用户线程已经完成了工作,是否有任何技术可以强制守护进程线程完成某些任务?,java,multithreading,Java,Multithreading,在我的主程序中,我运行1个用户线程,它的所有子线程都是守护进程线程。因此,当用户线程完成其工作时,所有守护进程线程也将终止。我正在守护进程线程中执行一些代码块,这些代码块必须在线程终止之前完成 如果用户线程完成了工作,是否可以在守护进程线程中等待特定的块执行?首先,如果确实需要某个线程运行某个代码块来完成执行,那么该线程实际上不是守护进程线程 但是,为了完成您的要求,您可以让主线程先通过等待守护进程线程,如果确实需要某个线程运行某个代码块来完成执行,那么该线程实际上不是守护进程线程 但是,为了完

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


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

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


但是,为了完成您的要求,您可以让主线程先通过

等待守护进程线程,如果确实需要某个线程运行某个代码块来完成执行,那么该线程实际上不是守护进程线程


但是,为了完成您的要求,您可以让主线程通过

等待守护进程线程。您是否查看了倒计时闩锁或循环屏障


你看过倒计时闩锁或循环屏障了吗


您可以通过不同的方式实现这一点

使用Thread.join; 使用观察者可观察模式 使用倒计时锁存器
您可以通过不同的方式实现这一点

使用Thread.join; 使用观察者可观察模式 使用倒计时锁存器
我认为这取决于你真正想做什么:

您希望避免恶魔线程在处于关键部分时被关闭。 解决方案:demon线程在本节中获得读锁,而用户线程必须在死之前获得写锁。 您有一个相当独立的代码块要在关闭前执行。 解决方案:关闭吊钩

Runtime.getRuntime.addShutdownHooknew线程{ public void运行{database.close;} };

您希望优雅地关闭线程。解决方案:使用用户线程。打断他们以阻止他们。使用其中一个命名的解决方案等待

更详细的项目符号1:

这是基于


我认为这取决于你真正想做什么:

您希望避免恶魔线程在处于关键部分时被关闭。 解决方案:demon线程在本节中获得读锁,而用户线程必须在死之前获得写锁。 您有一个相当独立的代码块要在关闭前执行。 解决方案:关闭吊钩

Runtime.getRuntime.addShutdownHooknew线程{ public void运行{database.close;} };

您希望优雅地关闭线程。解决方案:使用用户线程。打断他们以阻止他们。使用其中一个命名的解决方案等待

更详细的项目符号1:

这是基于


您是否尝试过Thread.join?如果您必须等待线程中的某些内容完成,为什么它是守护进程线程。我会把它做成普通的线。没有必要使后台线程成为守护进程。@PeterLawrey我正在守护进程线程中运行一些无限循环。因此,如果我试图以正常方式停止应用程序,那么如果我使用用户线程,它就无法停止。我仍然需要在守护进程终止之前完成启动的部分代码。你可以用一个标志告诉线程正常关闭,因为只有它们知道何时完成它们需要做的事情。你尝试过Thread.join吗?如果你必须等待线程中的某个内容完成,为什么它是守护进程线程。我会把它做成普通的线。没有必要使后台线程成为守护进程。@PeterLawrey我正在守护进程线程中运行一些无限循环。因此,如果我试图以正常方式停止应用程序,那么如果我使用用户线程,它就无法停止。我仍然需要在守护进程终止之前完成启动的部分代码。您可以用一个标志告诉线程正常关闭,因为只有它们知道何时完成它们需要做的事情。
// 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