Java中的简单线程行为

时间:2010-01-02 08:59:40

标签: java multithreading

/* 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行)的形式串行执行。

我将循环更改为每个循环中最多运行10个循环。我期待30行和顺序的变化。但奇怪的是,S永远不会执行并退出程序!!

不应该迟早有机会吗?正如我所读到的那样,除了deamon线程之外,JVM仅在用户线程完成后关闭。

alt text http://img36.imageshack.us/img36/6646/69458021.png

5 个答案:

答案 0 :(得分:4)

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

你可以尝试递增循环到 20 而不是10.我猜你会看到 18行M

(似乎问题是输出窗口上没有滚动条。如果存在则调整大小应该有效。)

答案 1 :(得分:2)

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

重新检查你的问题!!

答案 2 :(得分:1)

这应该有效。您可以将日志放入run()方法或使用断点进行调试。

答案 3 :(得分:1)

窗口中只显示18行。

所有“S”行都已滚动,以及两条“N”行。

答案 4 :(得分:0)

我尝试在Windows Sun JVM 1.6上运行您的代码,正如预期的那样,我有30行。你使用什么样的JVM? 所有非守护程序线程应在JVM存在之前完成。