繁体   English   中英

Java中的简单线程行为

[英]Simple Threads Behaviour in Java

/* Multiple Threads Executing
 * Author Myth17
 */

class T1 implements Runnable
{
    public void run()
    {
        for(int c=0;c<10;c++)
        System.out.println(Thread.currentThread().getName()+" running....");
    }
}

class T2 implements Runnable
{
    public void run()
    {
        for(int c=0;c<10;c++)
        System.out.println(Thread.currentThread().getName()+" running....");
    }
}


class T3 implements Runnable
{
    public void run()
    {
    for(int c=0;c<10;c++)   
    System.out.println(Thread.currentThread().getName()+" running....");    
    }
}

class Rt
{
    public static void main(String args[])
    {
        T1 j1=new T1();
        T2 j2=new T2();
        T3 j3=new T3();

        Thread w1=new Thread(j1);
        w1.setName("S");
        Thread w2=new Thread(j2);
        w2.setName("N");
        Thread w3=new Thread(j3);
        w3.setName("M");

        w1.start();
        w2.start();
        w3.start();
    }
}

如果循环在三个for循环中最多运行3个,则在Linux Java JVM中,每个线程以SSSNNNMMM(9行)的顺序执行。

我将循环更改为每个for循环最多可以运行10个循环。 我原本希望30行,然后更改顺序。 但是奇怪的是,S从不执行,程序退出!!

S不该早晚获得机会吗? 据我了解,除了守护进程线程外,JVM仅在用户线程完成后才关闭。

替代文字http://img36.imageshack.us/img36/6646/69458021.png

您是否意识到输出文件夹中有8行N10行M。 似乎输出窗口仅显示18行。 S运行,但是您看不到它。

你可以尝试增加环路的20,而不是10。我想你只会看到18行M的

(似乎问题在于输出窗口上没有滚动条。如果存在调整大小,则应该可以使用。)

在您的代码段中,两个线程都不是守护程序。 在通过Thread#setDaemon()将线程设置为守护程序之前,所有线程将在应用程序退出之前完全执行。

重新检查你的问题!

这应该起作用了。 您可以将日志放入run()方法或使用断点对其进行调试。

窗口中仅显示18行。

所有“ S”行以及其中两个“ N”行均已滚动。

我尝试在Windows Sun JVM 1.6上运行您的代码,并且按预期,我得到了30行。 您正在使用哪种JVM? 所有非守护程序线程都应在JVM存在之前完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM