预期多线程输出

时间:2013-10-13 10:49:47

标签: java multithreading oop

我是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

我希望第一个线程始终在第二个线程之前执行。 请解释我的输出。提前谢谢。

3 个答案:

答案 0 :(得分:5)

原因是当线程开始运行时你无法猜出它们出现的非常基本的线程问题的顺序 - 你可以阅读: http://www.codeproject.com/Articles/616109/Java-Thread-Tutorialhttp://www.vogella.com/articles/JavaConcurrency/article.html 或任何其他基本线程导师。 祝你好运。

答案 1 :(得分:4)

这是一个考虑程序中多线程的模型。想象一下,两个人,Thread1和Thread2,独立工作,在不同的房间里,每个人都按照自己的节奏和不同的咖啡休息时间表。每个人都可以访问共享的纸张并添加一行。

假设除了一次只有一个人可以写入论文的规则之外没有协调,你会对他们的行如何交错有任何期望吗?

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

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

答案 2 :(得分:0)

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

如果你想了解Java中的多线程,你一定要开始熟悉concurrent package。它包含用于常见问题的现成工具。更重要的是:它提供了一种处理多线程解决方案的方法,通过智能代码设计首先避免了大多数问题。