- Java code
public class text extends Thread{ public void run(){ while(true){ System.out.println("sss"); } } public static void main(String xa[]){ text tt=new text(); Thread t=new Thread(tt); t.start(); try { t.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }
想知道为什么有t.wait(),而线程不能停下来?而且还会报错?
wait是属于object的方法,虽然thread也是属于object下的,但t.wait()是不是不能这么用?必须是object的实例调用wait?
这个暂停和恢复该怎样做?
------解决方案--------------------
我想这暂停和恢复应该都是在那个text类中的run()方法中来调用才能使当前线程暂时停止和恢复吧... 你试试~~
------解决方案--------------------
你对wait()的理解错误了
这个方法不是让一个线程wait,而是让一个监视器锁起来
这个监视器就是一个普通的对象
而线程通过synchronized(obj)把这个对象设置为监视器
synchronized (obj) {
需要同步的语句;
}
像你的需求:
- Java code
public class TestThread{ Object lock; public TestThread(Object lock){this.lock=lock;} public void run() { while(run) { synchronized (lock) // an ad-hoc lock { System.out.println("sss"); } } }}public class TestMain{public static void main(String xa[]){ Object lock=new Object(); TestThread t=new TestThread(); t.start(); //开始打印sss Tread.currentThread().sleep(10000); lock.wait();//应该看到打印sss持续10秒后停止; Tread.currentThread().sleep(10000); //再等10秒 lock.notifyAll(); //打印又继续了.... }}
------解决方案--------------------
wait()方法会使线程永久无线的等待下去,需要使用notify()或者notifyall()方法唤醒,而且wait()与notify(),notifyall()方法只能在同步块或同步方法中使用
------解决方案--------------------
wait 需要拿到同步锁,也就是状态监控,你直接调用当然出
IlleagleMonitorStateException 了。
------解决方案--------------------
你对wait()的理解错误了
这个方法不是让一个线程wait,而是让一个监视器锁起来
这个监视器就是一个普通的对象
而线程通过synchronized(obj)把这个对象设置为监视器
synchronized (obj) {
需要同步的语句;
}
wait()方法会使线程永久无线的等待下去,需要使用notify()或者notifyall()方法唤醒,而且wait()与notify(),notifyall()方法只能在同步块或同步方法中使用