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