synchronized (this) { completeTreadNo++;
if (completeTreadNo >= 3) {
notifyAll();
completeTreadNo = 0;
} else {
wait();
}这是我程序的片段,写在run()方法内,我同时起动了3个线程,但是当某个线程运行到notifyAll()是却没法唤醒wait的另外两个线程。
到底是怎么回事呢?
if (completeTreadNo >= 3) {
notifyAll();
completeTreadNo = 0;
} else {
wait();
}这是我程序的片段,写在run()方法内,我同时起动了3个线程,但是当某个线程运行到notifyAll()是却没法唤醒wait的另外两个线程。
到底是怎么回事呢?
解决方案 »
- 关于set.toArray
- 还是泛型,请无视或删除之前那贴
- 我又来了.我想问下关于ECLIPSE里可以查找类的插件可否在自己的程序中调用呢
- 两道JAVA题 给有兴趣的人帮解决
- 在一组 JRadioButton 中 stateChanged 与 itemStateChanged 有什么区别 谢谢!!!!!!在线等!!!!!!!!!!!!!!
- System.loadLibrary()能否调用其他路径下的dll文件?
- excel追加sheet问题
- ACMer求解
- 初学者问题
- jbuilder 光标位置与文字输入的的位置不一样 ?
- 一个很怪异的问题
- java 插入 mysql blob 对象时 语法错误
第一个线程进去后就一直等待
别的线程进来
而成为一个死锁
要有同一个实现了Runnable接口的对象产生Thread
这样你写的程序才可以
synchronized (this) { completeTreadNo++;
if (completeTreadNo >= 3) {
notifyAll();
completeTreadNo = 0;//这里你有将这个变量置为零,就有可能使得所有的线程
// 都不会被唤醒
} else {
wait();
}
public class Test {
public static void main (String[] args) {
Runnable runnable=new myThread();
Thread objThread1=new Thread(runnable);
Thread objThread2=new Thread(runnable);
Thread objThread3=new Thread(runnable);
objThread1.start();
objThread2.start();
objThread3.start();
}
}
class myThread implements Runnable{
public static int completeTreadNo;
public void run(){
synchronized (this) {
completeTreadNo++;
if (completeTreadNo >= 3) {
notifyAll();
System.out.println("ok quit");
completeTreadNo = 0;
} else {
try{
wait();
System.out.println("ok quit");
}catch(Exception e){
}
}
}
}
}
2. 如你本意, 这段代码必须写到一个Runnable中,而分别使用new Thread(runable)来创建多个线程才会对同一个对象同步
(即竞争地是同一个资源).此处假设你的completeTreadNo是个非static变量
3. 执行过程应该是这样的:
a. 线程1: no=1, wait()
b. 线程2: no=2, wait()
c. 线程3: no=3, notifyAll()[这里只唤醒一个线程,还有一个仍在wait], no=0
4. 请验证
1. notifyAll只能用来唤醒一个线程,而不会唤醒所有线程
唤醒所有的(在该对象上边等待的),你的理解不对
2. 如你本意, 这段代码必须写到一个Runnable中,而分别使用new Thread(runable)来创建多个线程才会对同一个对象同步
(即竞争地是同一个资源).此处假设你的completeTreadNo是个非static变量 一样的[
3. 执行过程应该是这样的:
a. 线程1: no=1, wait()
b. 线程2: no=2, wait()
c. 线程3: no=3, notifyAll()[这里只唤醒一个线程,还有一个仍在wait], no=0
没有执行else语句,根本没有wait()啊
4. 请验证
[/Quote]