/* 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仅在用户线程完成后关闭。
答案 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存在之前完成。