【问题标题】:Multithread output not expected不期望多线程输出
【发布时间】:2013-10-21 01:54:46
【问题描述】:

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

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

【问题讨论】:

  • 我从来没有理解过这些问题。如果你想要一个特定的执行顺序,你为什么要使用线程?
  • @EJP 我认为这种程序只是一个不懂线程想学习的人写的测试。
  • @Patricia Ya 完全正确。我只是想学习使用多个线程

标签: java multithreading oop


【解决方案1】:

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

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

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

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

【讨论】:

  • 这里有很多答案和cmets。只有你通过建议我现实生活中的例子来理解我的问题。我知道多线程与我认为的不同,但我仍然无法理解您的回答中“每个人都有自己的节奏”这一行。
  • @chetanmehta 我已经在该领域扩展了我的答案。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】: