Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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_Daemon - Fatal编程技术网

Java 如何将守护进程线程分类为特定线程?

Java 如何将守护进程线程分类为特定线程?,java,multithreading,daemon,Java,Multithreading,Daemon,我有3个线程,分别称为T1、T2和T3,还有3个守护进程线程,如dt1、dt2和dt3 我想(分配)向线程T1提供服务dt1,dt2向线程T2提供服务dt3向线程T3提供服务。 当线程T1、T2和T3完成其可运行任务时,相关的守护进程线程也在内部关闭 有谁能告诉我如何在java中使用线程守护进程概念吗?“守护进程线程”不是一个概念,它只是java线程的一个特性。当JVM终止时,它会等待非守护进程线程自行终止。相反,守护进程线程无论在做什么都会被终止 撇开它不谈,一个想法可能是在“守护进程”线程中

我有3个线程,分别称为
T1
T2
T3
,还有3个守护进程线程,如
dt1
dt2
dt3

我想(分配)向线程
T1
提供服务
dt1
dt2
向线程
T2
提供服务
dt3
向线程
T3
提供服务。 当线程
T1
T2
T3
完成其可运行任务时,相关的守护进程线程也在内部关闭

有谁能告诉我如何在java中使用线程守护进程概念吗?

“守护进程线程”不是一个概念,它只是java线程的一个特性。当JVM终止时,它会等待非守护进程线程自行终止。相反,守护进程线程无论在做什么都会被终止


撇开它不谈,一个想法可能是在“守护进程”线程中建立一个“关机”标志。当非守护进程线程终止时,它可以将该标志设置为true。守护进程线程将检查该标志,并在其为真时终止。请记住正确同步该机制,例如使用volatile关键字。

因此,如果我正确理解您的问题,您希望每个“工作线程”T1..T3都有自己的后台线程(dt1…dt3)进行一些协同处理,并且希望后台线程在主线程退出时退出,是吗?你可以这样做:

将每个“主线程T1…设置为如下所示的可运行状态,以便在启动T1时,它启动自己的dt1,然后在完成时要求它关闭(通过中断()

   @Override
   public void run() {
      ExecutorService e = Executors.newSingleThreadExecutor();
      Runnable r = new Runnable() {

         @Override
         public void run() {
            // this is your deamon thread
            boolean done = false;
            while (!done && !Thread.currentThread().isInterrupted()){
               // Do your background deamon stuff here.
               //
               // Try not to use blocking, uninterruptible methods.
               //
               /* If you call a method that throws an interrupted exception,
                * you need to catch that exception and ignore it (or set done true,)
                * so the loop will terminate. If you have other exit conditions, 
                * just set done=true in this body */
            }
         }
      };
      e.execute(r);  // launch your daemon thread

      try {
         // do your main stuff here 
      }
      finally {
         e.shutdownNow(); // this will 'interrupt' your daemon thread when run() exits.
      } 
   }

你是说类似于
回调的东西吗?谢谢stefan,我对executor框架了解不多,我想问的是有没有办法将守护进程线程分配给特定的线程(如果我有多个线程和多个守护进程,每个守护进程都属于特定的线程)。例如,如果一个线程想要表现得像一个我们称之为isDaemon(布尔)的线程。但是我想把这个守护进程线程分配给java中的特定线程。你说的“分配”是什么意思?你是说
join()
?是的,只是那样而已。当我们在任何线程上调用join()时,它将进入等待状态,直到完成该线程。因此,在这种情况下,我怀疑在所有线程完成或分配(加入)线程完成后,守护进程线程的性质是否会被破坏?感谢JVMATL共享信息,您完全理解了我的问题,但您使用executor framework进行了解释,我需要没有executor framework的具体线程我需要threads setDeamon()和join()。在这个解释中,您使用了匿名可运行任务,jvm如何知道这是一个deamon(匿名)线程。请分享这些信息。@RajasekharBurepalli Hi Raj!帮助我们进一步了解您的问题的上下文:(1)确切地说,为什么您觉得您特别需要守护进程线程?人们使用守护进程线程的主要原因是,如果JVM仍在运行,它们不会阻止JVM退出——但您希望确保“守护进程”完全关闭,因此您需要(或认为您需要)守护进程肯定还有其他原因——您能解释一下吗?(2) 另外:你说你“需要”setDaemon()和join()而不是executor框架-如果你可以用executors实现同样的效果-那可以吗?@RajasekharBurepalli(我还应该指出,尽管我的示例使用了匿名runnable,但你可以将自己的runnable提交给执行者。(但是,重要的是不要将可运行线程与其运行的线程混淆;相同的可运行线程在其生命周期内可以在守护进程线程和非守护进程线程中运行。线程对象只能启动一次,但可运行线程可以反复运行。)