Abu*_*lib 2 java multithreading time-wait wait
我试图熟悉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();
}
Run Code Online (Sandbox Code Playgroud)
}
你的线程每个都在等待并通知单独的对象 - 所以它们根本没有相互通信.如果您希望它们有效地相互释放,则需要共享监视器来同步,等待并通知.
当你指定超时时它正在"工作",因为它有效地将等待调用转换为睡眠调用...仍然没有什么真正等待/通知有用,因为这两个线程仍在处理单独的监视器.
| 归档时间: |
|
| 查看次数: |
1189 次 |
| 最近记录: |