Collection 类 本身 extends Threads代码太多,只贴上关键代码 private Object lock = new Object();
private Object task = new Object(); public String getSuspend() {
return suspend;
} public void setSuspend(String suspend) {
this.suspend = suspend;
}        private void Execute(HashMap map) {
                .................
long a = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
synchronized (task) {
                                // 我现在有一个SWING界面 有4个按钮,暂停按钮 setSuspend("1")
if (getSuspend().equals("1")) {
try {
this.Notify("a"); // 当暂停按钮别按下否,开始循环检查 新的 getSuspend()
task.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
                        ..............执行任务
}
} private void Resume() {
synchronized (lock) {
this.setSuspend("0");
lock.notifyAll(); // 这里为什么不能把暂停的线程给唤醒呢?
Thread.yield();
}
} private void Stop() {
this.interrupt();
this.Close();
return;
} private void Notify(String name) {
Thread t = new Thread(name) {
public void run() {
boolean f = true;
while (f) {
try {
if (getSuspend().equals("2")) {
f = false;
Resume();
} else if (getSuspend().equals("3")) {
f = false;
Stop();
}
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
t.start();
}

解决方案 »

  1.   

     synchronized (task) {synchronized (lock) {
    你唤醒谁?他们根本不是一个组织的,
      

  2.   

    是啊,你要唤醒的是哪一个啊:
    public final void notify()    唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。    直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。    此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:        * 通过执行此对象的同步实例方法。
            * 通过执行在此对象上进行同步的 synchronized 语句的正文。
            * 对于 Class 类型的对象,可以通过执行该类的同步静态方法。     一次只能有一个线程拥有对象的监视器。 
      

  3.   


    task.wait();
    我要把 task 唤醒丫
      

  4.   

    private void Resume() {
    synchronized (lock) {
    this.setSuspend("0");
    task.notifyAll(); // 这行出异常
    Thread.yield();
    }
    }java.lang.IllegalMonitorStateException
    at java.lang.Object.notifyAll(Native Method)
    at org.zone.main.Collection.Resume(Collection.java:132)
    at org.zone.main.Collection.access$0(Collection.java:129)
    at org.zone.main.Collection$1.run(Collection.java:151)