我正在运行一个多线程程序,我遇到的问题是它每次运行时都会产生不同的输出。这是我的代码。
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();
}
}
每当我运行代码时它产生不同的输出,有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
让我们总结您的代码:
当您运行代码时,您将创建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
但是如果你真的问为什么你的线程名称不同,那么在你创建新线程时它们是正常的...