不工作的守护线程T1,T2,T3是类.我分开写.我犯了什么错误?为什么我的守护线程无法访问?



我的代码:

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虚拟机退出"(来源)。除此之外,守护线程的行为与非守护线程完全相同,语法和所有这些都是如此。它仍然必须与Runnablestart() 'ed一起构建,就像任何其他Thread一样。

但是,由于守护线程可能在JVM退出时突然终止,因此应该谨慎使用守护线程。特别是,不应该将守护进程用于任何I/O或资源清理。像finally块和堆栈展开这样的"正常"保证并不一定适用于守护进程线程——如果JVM决定退出,所有守护进程都会立即被放弃。(源)

Java守护进程应该只用于后台管理、簿记、度量、非关键监视等。

最新更新