Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中线程setdeamon的混淆_Java_Multithreading - Fatal编程技术网

java中线程setdeamon的混淆

java中线程setdeamon的混淆,java,multithreading,Java,Multithreading,根据java,当setDaemon设置为true时 它不会阻止JVM运行 程序结束时退出,但 线程仍在运行。一 守护进程线程的示例是 垃圾收集 从下面的代码示例中,当setDaemon设置为true时,主线程创建的线程停止执行,实际上它应该继续运行。当setDaemon被设置为false时,即使主线程退出,子线程的打印值仍然为i。 请澄清我的疑问 public class DeamonSample implements Runnable { public void run()

根据java,当setDaemon设置为true时

它不会阻止JVM运行 程序结束时退出,但 线程仍在运行。一 守护进程线程的示例是 垃圾收集

从下面的代码示例中,当
setDaemon
设置为true时,主线程创建的线程停止执行,实际上它应该继续运行。当
setDaemon
被设置为false时,即使主线程退出,子线程的打印值仍然为i。 请澄清我的疑问

public class DeamonSample implements Runnable
{
      public void run()
      {
            try 
{
System.out.println("T1 started...");

                  for (int i=0;i<1000;i++)
                  {
                        TimeUnit.SECONDS.sleep(1);
                        System.out.print(i+" ");
                  }
            } 
            catch (InterruptedException e) 
            {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
            finally
            {
                  System.out.println("T1 ended...");
            }

      }


      /**
      * @param args
      */
      public static void main(String[] args)
      {
            // TODO Auto-generated method stub
            System.out.println("Main Started...");
            System.out.println("Main Thread Type="+Thread.currentThread().isDaemon());
            DeamonSample deamonSample=new DeamonSample();
            Thread t1=new Thread(deamonSample);
            t1.setDaemon(true);
            t1.start();
            System.out.println("T1 Type="+t1.isDaemon());
            System.out.println("Main Thread Type="+Thread.currentThread().isDaemon());
            System.out.println("Main ended...");
      }

}
公共类DeamonSample实现可运行
{
公开募捐
{
尝试
{
System.out.println(“T1开始…”);

对于(int i=0;i默认情况下,线程不是守护进程线程。如果使用任何非守护进程的线程到达主线程的末尾,则进程将继续运行。通过调用
setDaemon(true)
您告诉JVM您的线程不应该在main末尾阻止关机。

默认情况下,线程不是守护进程线程。如果您使用任何非守护进程的线程到达main末尾,则进程将继续运行。通过调用
setDaemon(true)
您告诉JVM您的线程不应该在main结束时阻止关闭。

t1.setDaemon(true)时,DeamonSample实例肯定不会停止执行;
;您看到的不确定性来自打印。字符在合并到单个流之前会写入线程本地缓冲区

这里有一些代码可以说明。两个线程轮流递增计数器并打印其状态,但是您看到的数字可能非常混乱

import java.util.concurrent.atomic.AtomicInteger;

public class FunnyPrinter extends Thread {
    static AtomicInteger counter = new AtomicInteger(0);

    int parity;

    public FunnyPrinter(int parity) {
        super();
        this.parity = parity;
    }

    public void run() {
        for (;;)
            if (counter.intValue() % 2 == parity)
                System.out.println(counter.incrementAndGet());
    }

    public static void main(String[] args) {
        FunnyPrinter t1 = new FunnyPrinter(0), t2 = new FunnyPrinter(1);
        t1.start(); t2.start();
    }
}

如果需要确定,请在块结束之前在
System.out
flush
上同步它。

t1.setDaemon(true)时,DeamonSample实例肯定不会停止执行;
;您看到的不确定性来自打印。字符在合并到单个流之前会写入线程本地缓冲区

这里有一些代码可以说明。两个线程轮流递增计数器并打印其状态,但是您看到的数字可能非常混乱

import java.util.concurrent.atomic.AtomicInteger;

public class FunnyPrinter extends Thread {
    static AtomicInteger counter = new AtomicInteger(0);

    int parity;

    public FunnyPrinter(int parity) {
        super();
        this.parity = parity;
    }

    public void run() {
        for (;;)
            if (counter.intValue() % 2 == parity)
                System.out.println(counter.incrementAndGet());
    }

    public static void main(String[] args) {
        FunnyPrinter t1 = new FunnyPrinter(0), t2 = new FunnyPrinter(1);
        t1.start(); t2.start();
    }
}

如果需要确定,请在
System.out
上同步,并在块结束之前刷新它。

在守护进程线程可以打印出所有数字之前,主线程终止。。。 如果新线程isDaemon=true,请在启动线程()后尝试此行:


您将看到,守护进程线程将结束…(至少,这不再是多线程,但该示例仅用于澄清目的)

在守护进程线程可以打印出所有数字之前,主线程终止。。。 如果新线程isDaemon=true,请在启动线程()后尝试此行:

您将看到,守护进程线程将结束…(至少,这不再是多线程,但该示例仅用于澄清目的)

在下面的代码示例中,当setDaemon设置为true时,由主线程创建的线程将停止执行

不会发生这种情况。请再次检查输出。输出将包含以下行:

主服务器已启动…
主螺纹类型=假
T1类型=真
主螺纹类型=假
主端

…实际上它应该继续运行

由于所有非守护进程线程(main)都已完成,jvm将退出

当setDaemon设置为false时,即使主线程退出,子线程的打印值仍然为i。请澄清我的疑问

正确的

在下面的代码示例中,当setDaemon设置为true时,由主线程创建的线程将停止执行

不会发生这种情况。请再次检查输出。输出将包含以下行:

主服务器已启动…
主螺纹类型=假
T1类型=真
主螺纹类型=假
主端

…实际上它应该继续运行

由于所有非守护进程线程(main)都已完成,jvm将退出

当setDaemon设置为false时,即使主线程退出,子线程的打印值仍然为i。请澄清我的疑问

正确的