【发布时间】:2014-10-24 13:04:35
【问题描述】:
好的,我最近一直在尝试理解线程和线程同步。我编写了一个程序,该程序应该按该顺序一遍又一遍地输出 abc,每个字符都映射到一个线程。问题是,它不工作,我不知道为什么。这是我的代码:
package application2;
public class Application2 {
private static int turn = 0;
private static String[] names = new String[3];
private static class syncThreads extends Thread {
private final char charToPrint;
//private final int times;
public syncThreads(char charToPrint) {
this.charToPrint = charToPrint;
//this.times = times;
}
@Override
public synchronized void run() {
String myName = Thread.currentThread().getName();
for (int i = 0; i < 20; i++) {
if (myName.equals(names[turn])) {
System.out.print(charToPrint);
}
turn++;
if (turn == 3) {
turn = 0;
}
}
notifyAll();
try {
Thread.currentThread().wait(200);
} catch (InterruptedException e) {
}
}
}
public static void main(String args[]) {
syncThreads t1 = new syncThreads('a');
names[0] = t1.getName();
syncThreads t2 = new syncThreads('b');
names[1] = t2.getName();
syncThreads t3 = new syncThreads('c');
names[2] = t3.getName();
t1.start();
t2.start();
t3.start();
//Join method ensures proper synchronization
try {
t1.join();
t2.join();
t3.join();
} catch (Exception e) {
System.out.println("Interrupt Exception.");
}
}
}
如您所见,我正在尝试使用同步的 run() 函数,该函数使用令牌值来告诉打印哪个线程。当我运行它时,我得到了非常奇怪的结果,例如 aaaaaabbbbcccc 和 abbabbaaaaccccbbccc 等。知道为什么这些线程没有同步吗?我在这里错过了什么?
感谢您的帮助!
【问题讨论】:
-
您不仅在错误的事物上同步(这个,而不是共享对象,如 Chris 链接的问题所示),您还在等待中解锁行动。
-
你在等待循环之外等待。
-
这完全违背了并发线程的想法——它们异步工作。这很难,因为你正试图用螺丝刀敲钉子。
标签: java multithreading synchronization synchronized