【发布时间】:2019-04-26 13:02:57
【问题描述】:
我尝试创建一个扩展线程的类,它只需要一个字符串数组并交替打印前 2 个字符串,以进行 10000 次迭代。我使用 AtomicInteger (计数器)跟踪要打印的索引,但是输出有时会打印: 你好 你好 你好 w 你好 你好 等等 而不是在每次迭代时交替。为什么会这样?如果不将“同步”放在 run 方法中,我该如何解决?
public class MyThreadDelegate implements Runnable {
List<String> words;
AtomicInteger counter = new AtomicInteger(0);
public MyThread(List<String> words) {
this.words = words;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println(words.get(counter.getAndIncrement()%2) + counter.get());
}
}
public static void main(String[] args) {
MyThreadDelegate myThreadDelegate = new MyThreadDelegate(Arrays.asList("hello", "w"));
Thread t1 = new Thread(MyThreadDelegate);
Thread t2 = new Thread(MyThreadDelegate);
t1.start();
t2.start();
}
}
【问题讨论】:
-
拜托!将
MyThread extends Thread更改为MyThreadDelegate implements Runnable。您的myThread对象不是线程,因为您从不调用myThread.start()。您的t1和t2对象是线程,每个都使用您的myThread对象作为它们的Runnabledelegate。 -
P.S.,这个练习教你一些关于如何同步线程的知识,但是在任何实际程序中,如果线程不花费至少 一些 时间独立运行,不同步的任务,那么这几乎违背了首先使用线程的整个目的。
标签: multithreading concurrency atomicinteger