多线程程序产生不同的输出

时间:2014-08-12 08:39:17

标签: java multithreading

我正在运行一个多线程程序,我遇到的问题是它每次运行时都会产生不同的输出。这是我的代码。

package com.mypackage;

public class TryThreads extends Thread{

    int i=-10;
    public static void main(String arg[]){
        TryThreads tt1=new TryThreads();
        TryThreads tt2=new TryThreads();
        tt1.start();
        tt2.start();

    }
    public synchronized void run() {
        for(;i<=10;i++) {
            System.out.println(TryThreads.getThreadName()+"  "+i);
        }
    }
    static String getThreadName() {
        Thread t1=new Thread();
        return t1.getName();
    }
}

每当我运行代码时它产生不同的输出,有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

让我们总结您的代码:

  1. 你正在开始两个主题。
  2. 您的线程从i = -10到10
  3. 循环
  4. 每个循环都调用一个静态方法。
  5. 静态方法每次都会创建一个新线程并返回 新线程的名称。
  6. 调用者线程输出每个NEW线程的名称加上索引 变量i。
  7. 当您运行代码时,您将创建2 + 42个线程(索引0到43)。

    首先没有意义的是你正在同步run()方法,这是无用的,因为两个线程都在处理它们自己的对象。不同的输出是预期的,因为您无法预测两个线程中的一个何时处于活动状态并迭代静态getThreadName()方法。可能是Thread1在执行一次之前进行了3次迭代。但也可能是Thread2在Thread1生成之前进行了五次迭代。

    此行为称为种族混淆。如果您不在应用程序代码中管理线程,则由VM / OS来处理。

答案 1 :(得分:0)

这是正常的,但如果你这样做:

public static void main(String arg[]){
    TryThreads tt1=new TryThreads();
    TryThreads tt2=new TryThreads();
    tt1.start();
    tt2.start();
    tt1.join();
    tt2.join();

}

然后你应该获得第一个线程1名称,然后获得第2个线程名称。你得到不同的结果是正常的。通常,您将线程结果存储在例如不同的类变量中,以确保一切都是线程安全的。例如,将数据写入某个变量同步的制作方法。有很多方法可以做到这一点。但在你的情况下,你得到的结果是因为你没有将线程连接到主线程。如果你生成的线程比打印线程名更多,那就更明显了。

这是关于线程的好文章 - &gt; THREADS

但是如果你真的问为什么你的线程名称不同,那么在你创建新线程时它们是正常的...

相关问题