如果要唤醒进程不能使用interrupt方法中断进程,这样没法在唤醒
要让进程等待建议只是用wait()
在thinking in java中说:sleep和suspend不建议使用,因为容易使程序陷入死锁
他们再让进程等待的时候不释放共享资源。而使用wait会释放共享资源
要让进程等待建议只是用wait()
在thinking in java中说:sleep和suspend不建议使用,因为容易使程序陷入死锁
他们再让进程等待的时候不释放共享资源。而使用wait会释放共享资源
调试欢乐多
你的匿名thread中的run方法中的synchronized(this), 这里的this
和jbutton2_xxx方法中的this不是一个东西.
前者只的是匿名类,后者是不是你的界面呀?总之不着两个不是一个对象.
那你等待,唤醒当然没有用了. 你可以把前者的this改为 类名.this 即 UI.this
试试吧.
注:suspend()这个方法已经作废了!
你可以这样想,notifyAll只能够唤醒在同一个对象实例上wait的线程。
如果你非要达到那个效果,下面是修改的代码:
//在你的UI类里面添加,一个内部类叫ThreadTest。并且增加一个数据成员叫做test。
ThreadTest test = new ThreadTest(); class ThreadTest
{
public void waitUntil()
{
try {
synchronized(this){
wait(10000);
System.out.println("Hello!");
}
}catch(InterruptedException e){}
} public synchronized void wakeup()
{
notifyAll();
}
}//然后,修改你的两个Button响应事件:
void jButton1_actionPerformed(ActionEvent e) {
for (int i = 0; i < 2; i++)
{
new Thread(){
public void run()
{
test.waitUntil();
}
}.start();
}
}void jButton2_actionPerformed(ActionEvent e) {
synchronized(this){
System.out.println("I am notifying everybody!");
test.wakeup();
}
}你再试试吧!
void jButton1_actionPerformed(ActionEvent e)
{
for(i=0; i<2; i++ ){
threads[i] = new Thread()
{
public void run()
{
synchronized(this){
this.wait(1000*60*10);
System.out.println("hello world");
}
this.interrupt();
}
};
threads[i].start();
}
} void jButton2_actionPerformed(ActionEvent e)
{
for (int i=0;i<threads.length;i++){
synchronized(threads[i]){
threads[i].notifyAll();
}
}
}
synchronized(this){
this.wait(1000*60*10);
System.out.println("hello world");
}
首先,你的程序获取this这个对象(也就是当前对象)的排它性使用权,然后,调用wait()。使当前线程在这this对象上wait,并且会放弃对这个对象的排它性使用权。
这个时候,你如果在另一个线程中,获取该对象的排它性使用权,调用它的notifyAll方法.这样你才能。唤醒在这个对象上wait的其他线程。象你原来的实现,因为你在notifyAll方法和wait方法获取的排它性使用权的对象,并不是同一个对象。一个是匿名的内部类对象,另一个是jFrame对象。当然,无法唤醒了!!所以请深刻理解synchronized(this)的含义。如果对线程有兴趣,去看看这篇文章:
http://www.csdn.net/develop/article/17/17290.shtm
{
new Thread()
{
public void run()
{
if( i++ > 3 ){
synchronized(this){
this.notify();
return;
}
} synchronized(this){
this.wait();
}
System.out.println("hello world");
}
}.start();
}
那这样为什么也不能唤醒啊? this 不是当前线程吗 ?
你用new Thread()这个对象锁,锁住线程,却用别的对象锁来唤醒,当然不行。
看不懂了!
试着不要将this同步,换个对象试试!!