2013-10-13 62 views
-2

我是新来的Java和多线程的概念。这里是我的实验代码:多线程输出预计不到

public class Multithread implements Runnable { 

    Thread t; 

    public Multithread(int prior, String name) { 
     this.t = new Thread(this, name); 
     this.t.setPriority(prior); 
     this.t.start(); 
    } 

    public void run() { 
     for (int i = 1; i <= 5; i++) { 
      if (this.t.getName().equals("thread1")) { 
       System.out.println("First Child Thread Loop No " + i); 
      } 
      else { 
       System.out.println("Second Child Thread Loop No " + i); 
      } 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       System.out.println(e); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     new Multithread(10, "thread1"); 
     new Multithread(7, "thread2"); 
    } 
} 

输出是:

First Child Thread Loop No 1 
Second Child Thread Loop No 1 
First Child Thread Loop No 2 
Second Child Thread Loop No 2 
Second Child Thread Loop No 3 
First Child Thread Loop No 3 
Second Child Thread Loop No 4 
First Child Thread Loop No 4 
Second Child Thread Loop No 5 
First Child Thread Loop No 5 

嗯,我预计会有这样简单:

First Child Thread Loop No 1 
Second Child Thread Loop No 1 
First Child Thread Loop No 2 
Second Child Thread Loop No 2 
First Child Thread Loop No 3 
Second Child Thread Loop No 3 
First Child Thread Loop No 4 
Second Child Thread Loop No 4 
First Child Thread Loop No 5 
Second Child Thread Loop No 5 

我期望能获得前总是执行第一线第二个线程。 请解释我的输出。提前致谢。

+1

我永远不会理解这些问题。如果你想要一个特定的执行顺序,为什么你使用线程? – EJP

+0

@EJP我认为这种程序只是一个不懂线程并想学习的人编写的测试。 –

+0

@Patricia雅正好。我只是想学习与多个线程 –

回答

4

下面是在您的程序中考虑多线程的模型。想象一下,两个人,即Thread1和Thread2独立工作,分别在不同的房间里,每个人都按自己的步调和不同的茶歇时间表。每个人都可以访问共享的纸张并添加一行。

假设除了一次只能写一篇文章的规则之外没有任何协调,你会对他们的行将如何交错有何期待吗?

编辑============================================= =============

计算机线程并不都以相同的有效速度运行。人们可能会遇到不同的缓存未命中。除非系统完全专用于这一个应用程序,否则难以实现的状态会导致处理器的中断和时间共享,从而减慢一个线程的速度。

+0

以及在这里的答案和评论。只有你通过暗示我真实生活的例子来理解我的问题。我已经理解了多线程与我认为的不同,但我仍无法在你的回答中“按自己的步调”理解这条线。 –

+0

@chetanmehta我已经扩大了我在这方面的答案。 –

0

线程的基本规则:线程的工作是未定义的。可能会在一段时间后,或一小时后立即发生。没有任何保证。

如果您想了解Java中的多线程,您应该开始熟悉concurrent package。它包含用于解决常见问题的即用型工具。更重要的是:它提供了一种处理多线程解决方案的方法,通过智能代码设计可以避免大部分问题。