【问题标题】:Output in threads are not in order线程中的输出不按顺序
【发布时间】:2015-04-13 16:32:46
【问题描述】:
public class MainClass {
    public static void main(String args[]){
        NewThread ob1 = new NewThread("One");
        NewThread ob2 = new NewThread("Two");
        NewThread ob3 = new NewThread("Three");

        try{
            System.out.println("Waiting for threads to finish.");
            ob1.t.join();
            ob2.t.join();
            ob3.t.join();
        } catch (InterruptedException e){
            System.out.println("Main thread interrupted");
        }

        System.out.println("Exiting main thread.");
    }
}
class NewThread implements Runnable {
    Thread t;

    NewThread(String name){
        t = new Thread(this, name);
        System.out.println("New thread: " + t);
        t.start();
    }

    public void run(){
        try{
            for(int i=3; i>0; i--){
                System.out.println(t.getName() + ": " + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e){
            System.out.println(t.getName() + " interrupted.");
        }
        System.out.println("Exiting " + t.getName());
    }
}

上面的代码是为了给出这个输出:

新线程:线程[One,5,main]
新线程:线程[Two,5,main]
新线程:线程[三,5,主]
正在等待线程完成。
一:3
二:3
三:3
一:2
二:2
三:2
一:1
二:1
三:1
退出一个
退出两个
退出三
退出主线程。

相反,它给出如下输出:

新线程:线程[One,5,main]
新线程:线程[Two,5,main]
一:3
新线程:线程[三,5,主]
二:3
正在等待线程完成。
三:3
三:2
一:2
二:2
三:1
二:1
一:1
退出两个
退出三
退出一个
退出主线程。

请帮我更正代码。

【问题讨论】:

  • 您为什么希望它们按这个顺序排列?启动多个线程的全部意义不在于它们可以异步进行工作吗?
  • 同上:如果您希望一系列事件以特定顺序发生,请编写代码在单个线程中按该顺序执行它们。每个多线程程序都需要在线程之间进行一些同步,但是您使用的同步越多,您从多个线程中获得的好处就越少。多线程编程的真正挑战是想出一个依赖于线程之间紧密耦合的问题的解决方案。
  • P.S.; Thread.sleep(t) 可以用于演示和实验,但你不应该依赖它作为同步线程的手段。超时参数t 只是调用实际需要多长时间的下限,并且在加载的系统上,实际的睡眠时间可能是不可预测的。 Thread.sleep() 是一个原始操作,旨在用于更高级别的类(例如 ScheduledThreadPoolExecutor),用于调度周期性事件、延迟事件、警报等。
  • 如果您解释了为什么您认为这是一个问题,这将有所帮助。例如,您认为是什么原因导致Exiting One 必须在Exiting Two 之前打印?代码在哪里反映了这种意图?

标签: java multithreading


【解决方案1】:

由于您正在执行多线程,因此无法保证如果不给线程比另一个线程更高的优先级,线程将运行什么顺序。仅仅因为您希望输出按特定顺序排列,IMO 就违背了多线程的目的。您可能一开始就没有产生线程。对于“真正的”多线程,我希望您的输出会像您展示的那样混合在一起,但同样不能保证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多