我的代码:
package multithreading;
public class JoinT1T2T3 extends Thread
{
public void run()
{
if(Thread.currentThread().isDaemon())
{
System.out.println("Daemon thread is running");
}
else
{
System.out.println("Slave thread");
}
}
public static void main(String args[])
{
Thread t=new Thread();
t.setDaemon(true);
T1 thread1=new T1();
T2 thread2=new T2();
T3 thread3=new T3();
System.out.println("First Thread name is::: "+thread1.getName());
thread1.setName("XXXXXXXXXX");
System.out.println("First Thread After changing name::: "+thread1.getName());
System.out.println("First thread's id is :::"+thread1.getId());
thread1.start();
try
{
thread1.join(3000);
}
catch(Exception e)
{
System.out.println("-----------");
}
//thread2.start();
thread2.start();
thread3.start();
}
}
为什么我的守护进程不可达?请给我一个解释和代码。
T1、T2、T3是三个不同的类别。主方法也是run方法。我创建了一个新的线程实例。仍然得到"代码不可达"。即if{} else{} in run method
您将获得"不可达"错误,因为JoinT1T2T3#run()
从未在任何地方被调用。
到达JoinT1T2T3#run()
为了调用run()
方法,应该在构造时使用Thread#(Runnable)
显式地将包含它的类的对象传递给线程。例如:
Thread t = new Thread(new JoinT1T2T3());
现在,线程t
将调用JoinT1T2T3#run()
每当它启动。
运行t
即使t
是一个守护进程,它也必须像其他线程一样被start()
'ed,否则它不会运行。(因此JoinT1T2T3#run()
将永远不会被调用)所以你需要这样做:
Thread t = new Thread(new JoinT1T2T3());
t.setDaemon(true);
t.start();
解释"daemon"线程
一般来说,在Java中,守护线程和非守护线程之间的唯一功能区别是"当唯一运行的线程都是守护线程时,Java虚拟机退出"(来源)。除此之外,守护线程的行为与非守护线程完全相同,语法和所有这些都是如此。它仍然必须与Runnable
和start()
'ed一起构建,就像任何其他Thread
一样。
但是,由于守护线程可能在JVM退出时突然终止,因此应该谨慎使用守护线程。特别是,不应该将守护进程用于任何I/O或资源清理。像finally
块和堆栈展开这样的"正常"保证并不一定适用于守护进程线程——如果JVM决定退出,所有守护进程都会立即被放弃。(源)
Java守护进程应该只用于后台管理、簿记、度量、非关键监视等。