请教各位大虾!一个关于线程的小问题!

yuanhang3 2003-07-10 06:19:36
public class ThreadUser extends Thread{

private JLabel label = new JLabel();
private boolean doing = true;
private int i = 1;

public ThreadUser(JLabel lab) {
label = lab;
}
public void run()
{
try{
while(doing){
label.setText(Integer.toString(i));
i += 5;
Thread.sleep(200); }
synchronized(this){
while(!doing){ wait(); }
}
}
catch( InterruptedException e ){}

}
public void stopp()
{
doing = false;
notify();
}
public void parse()
{
doing = false;
}
public synchronized void redo()
{
doing = true;
notify();
}
}
当调用了parse()方法后,实现了暂停的作用。但是,当调用redo()方法后却不能实现继续计数的功能?
请问各位大虾:小弟的问题出在哪呢???
谢谢!!!!!!!
...全文
29 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
XKP 2003-07-14
  • 打赏
  • 举报
回复
客气客气
yuanhang3 2003-07-14
  • 打赏
  • 举报
回复
谢谢XKP兄~~~
XKP 2003-07-14
  • 打赏
  • 举报
回复
·········
yuanhang3 2003-07-14
  • 打赏
  • 举报
回复
哇……XKP兄今天怎么变成两颗星啦!!!!!
恭喜你呀!!!!!!!!!
XKP 2003-07-10
  • 打赏
  • 举报
回复
{
while(!doing){ wait(); }
}
当doing为false的话
就进入了wait()然后线程就停在这里了
直到你执行了
public synchronized void redo()
{
doing = true;
notify();
}
之后,wait()函数得到了notify
就可以继续往下执行

此时doing已经变成true了,所以第一个while的条件为
true,就可以继续了
yuanhang3 2003-07-10
  • 打赏
  • 举报
回复
楼上的XKP兄,小弟还是有点不理解:parse()方法调用后,doing已经为false了,那while语句不是停止工作了吗?那为什么里面的synchronized块还能执行呀?谢谢啦……呵呵
XKP 2003-07-10
  • 打赏
  • 举报
回复
为什么synchronized块可以放在while语句里面

你的教程里面说不能放在里面吗?
放在里面可以啊,这样锁定的时候就不会是整个run()的锁定
而只是部分的锁定


while(!doing){ wait(); }

而这一段只有在
public void parse()
{
doing = false;
}
之后才会执行阿
yuanhang3 2003-07-10
  • 打赏
  • 举报
回复
谢谢楼上hesi726(hesi) 啦!
看来是小弟看书时理解不够。
但是为什么synchronized块可以放在while语句里面,而且wait()方法还能在doing为 false时实现其功能呢???谢谢啦……
hesi726 2003-07-10
  • 打赏
  • 举报
回复
逻辑错掉了!
如下修改!
public void run()
{
try{
while(doing){
label.setText(Integer.toString(i));
i += 5;
Thread.sleep(200);
synchronized(this)
{
while(!doing){ wait(); }
}
}
}
catch( InterruptedException e ){}
}

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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