我正在尝试熟悉 SCJP 的 Java 线程,但我有一个问题。
在下面编写的代码中,我简单地创建了:两个具有公共数据存储(一个数组)的 Runnable 和一个同步的 write() 方法,依次用数据填充它,为每个 Runnable(A 和 B)依次留下一个字母作为标记.
我知道代码很粗糙,可以写得更好,但我正在寻求线程的道德。
所以现在当我运行它时,它永远不会终止,结果停止在:
还好。A0。
但是,当我将 wait() 更改为 wait(100) 时,它从 0 计数到 9 时工作得很好,并且它正常终止。有人可以为我解释一下背后的原因吗?
谢谢你。
public class ArrayThreads {
Object[] array = new Object[10];
boolean isA = true;
int position = 0;
int getIndex(){
return position;
}
class ThreadA implements Runnable{
synchronized void write(String value){
while(!isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("A");}
}
}
class ThreadB implements Runnable{
synchronized void write(String value){
while(isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("B");}
}
}
public static void main(String[] args){
ArrayThreads threads = new ArrayThreads();
Thread threadA = new Thread(threads.new ThreadA());
Thread threadB = new Thread(threads.new ThreadB());
System.out.println("Still good");
threadB.start();
threadA.start();
}
}