我创建了以下程序,该程序使用相同的线程实例运行两个线程。我已经初始化了一个计数器,当每个线程运行时,应该实现计数器值,最后它应该在控制台中输出。
public class MTThread {
static int count = 0;
public static void main(String arg[]){
System.out.println("Main started");
MTThreadInner in1= new MTThreadInner(1,count);
MTThreadInner in2= new MTThreadInner(2,count);
in1.start();
in2.start();
while (true) {
try {
in1.join();
in2.join();
break;
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Main finished, count = :"+ count);
}}
class MTThreadInner extends Thread {
int num; int counter;
MTThreadInner(int i,int z) {
counter=z;
num = i;
}
public void run(){
// TODO Auto-generated constructor stub
yield();
System.out.println("This ran Thread "+ num);
counter=counter+1;
}
}
但输出始终显示为" 0":
主要开始
这运行了Thread 1
这运行了线程2
主要完成,计数=:0
答案 0 :(得分:2)
输出应为count = 0
,因为您不会在任何地方更改此变量。
您要做的是将此变量复制到MTThreadInner.counter
中的另一个字段,其中每个帖子将其自身的副本更改为1
,但这是一个完全不相关的变量。
您可能希望做的是增加共享的线程安全变量。为此,我建议计算一个AtomicInteger
static AtomicInteger count = new AtomicInteger(0);
通过这种方式,您可以将引用复制到同一个共享的线程安全对象中,当您在每个线程中调用counter.incrementAndGet()
时,它将增加此对象。
答案 1 :(得分:1)
我创建了以下程序,该程序使用相同的线程实例运行两个线程。
不,您已创建了一个程序,该程序通过同一Thread
子类的不同实例运行两个线程。
应该实现计数器值,并且在最后它应该在控制台中输出。
您的Thread
子类的每个实例都有一个私有counter
变量,我确信这些线程会更新(但您怎么知道?)。这与静态变量MTThread.count
无关,这是您最后打印的内容。