>我创建了以下程序,该程序使用相同的线程实例运行两个线程。我已经初始化了一个计数器,当每个线程运行时,应该实现计数器值,最后它应该在控制台中输出。
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":
主启动
这运行了线程 1
这运行了线程 2
主完成,计数 = :0
应该count = 0
,因为您不会在任何地方更改此变量。
您要做的是将此变量复制到MTThreadInner.counter
中的另一个字段,其中每个线程将其自己的副本更改为1
但这是一个完全不相关的变量。
您可能期望做的是递增一个共享的线程安全变量。 为此,我建议将count设置为AtomicInteger
static AtomicInteger count = new AtomicInteger(0);
这样,您可以将引用复制到同一个共享的线程安全对象,当您在每个线程中调用counter.incrementAndGet()
时,它将递增此对象。
我创建了以下程序,该程序使用相同的线程实例运行两个线程。
不,您已经创建了一个程序,该程序通过同一Thread
子类的不同实例运行两个线程。
计数器值应该实现,最后应该在控制台中输出。
Thread
子类的每个实例都有一个私有counter
变量,我相信这些线程确实会更新(但你怎么知道呢? 这与静态变量 MTThread.count
无关,这是您在最后打印的内容。