多线程 wait()问题!

Yan_0629 2010-01-17 08:08:02

//group 是一个线程组,我想要这个线程组下面的所有线程等待``然后唤醒他们该怎么做?
Thread[] t = new Thread[group.activeCount()];
group.enumerate(t);
for (int i = 0; i < t.length; i++) {
synchronized (Worker.obj) {
t[i].wait();
}
}
System.out.println("公司该休息了....请明天再来!!!");
Thread.currentThread().sleep(3000);
System.out.println("公司休息完了...快来找工作!!!");
for (int i = 0; i < t.length; i++) {
synchronized (Worker.obj) {
t[i]..notify();
}
}

为什么 代码运行到 synchronized (Worker.obj) {
t[i].wait();
}这里的时候 程序就卡那了????
...全文
238 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
奔跑哥 2010-01-22
  • 打赏
  • 举报
回复
需要其他线程去唤醒他,你在当前已经wait了,当然不会下去了。得在另外一个线程唤醒。
xtsqianli 2010-01-20
  • 打赏
  • 举报
回复
来学习 学习
小腿vs15 2010-01-20
  • 打赏
  • 举报
回复
线程要想调用一个对象的wait()方法就要先获得该对象的监视锁,而一旦调用wait()后又立即释放该锁。。。 但是要通过notify便可唤醒。
qqbz 2010-01-17
  • 打赏
  • 举报
回复
需要其他线程去notify它。
非常典型的生产者-消费者例子,有非常多的例子,楼主可以找到很多相关资料。
lixkyx 2010-01-17
  • 打赏
  • 举报
回复
关键只是一句话:
调用wait而挂起的线程,必须由别的线程来执行notify或者notifyAll来唤醒它。

nitify是唤醒在某个对象上挂起的一个线程(如果有多个挂起的,则随机选择一个),notifyAll是唤醒该对象上挂起的所有线程。
kobeBryant_ 2010-01-17
  • 打赏
  • 举报
回复
for (int i = 0; i < t.length; i++) {                        
synchronized (obj[i]) {
System.out.println("aaa");
t[i].wait(); //所有线程都在这人wait住了,又没有人叫他
System.out.println("BBB");
}
}

就和一楼说的 一样,你让他wait了,还有有人叫他啊
Yan_0629 2010-01-17
  • 打赏
  • 举报
回复

for (int i = 0; i < t.length; i++) {
synchronized (obj[i]) {
System.out.println("aaa");
t[i].wait();
System.out.println("BBB");
}
}
我这样的话 他会不停的输出AAA 但是 BBB 一次都不出现???为什么?
Yan_0629 2010-01-17
  • 打赏
  • 举报
回复
group 只是一个 类别的线程组啊`不是所有的线程啊
就是所有工人的线程我都放那了```
但是我这代码是在公司的类里面运行的啊`

那如何使一个线程组下面的所有线程都处于等待状态呢`
SambaGao 2010-01-17
  • 打赏
  • 举报
回复

for (int i = 0; i < t.length; i++) {
synchronized (Worker.obj) {
t[i].wait();
}
}



所有的线程都是等待状态。它还怎么往下运行呢。
最起码。

for (int i = 0; i < t.length; i++) {
synchronized (Worker.obj) {
t[i].wait();
}
notify();//唤醒其它的线程。或者notifyAll() 唤醒所有线程
}


huangwj20042008 2010-01-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yan_0629 的回复:]
Java codefor (int i=0; i< t.length; i++) {synchronized (obj[i]) {
System.out.println("aaa");
t[i].wait();
System.out?-
[/Quote]
第一次循环的时候,先打印,再执行wait,一执行完,执行当前代码的线程就挂起了,同时把obj[0]对象的锁释放掉了。
如果楼主想要在某某条件下让线程等待,wait不应该写在这里,应该在线程的run方法里写。
线程不是你想让它停它就停,让它死它就死,你必须在run方法判断条件,然后根据条件进行相应处理。
比如run方法里写了死循环,然后就试图在外面结束这个线程,这是不对的。应该在run方法里这样写:
public void run{
while(needCycle){
//handle something
}
}
然后在线程外将变量needCycle置为false,线程就跳出循环,就结束了,即死亡了。
写wait也一样。
public void run{
synchronized(obj){
while(condition){
obj.wait();
}
}
}
lianghua19 2010-01-17
  • 打赏
  • 举报
回复
难道应该函数名后面加synchronized ?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧