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();
}
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();
}
解决方案 »
- 怎样对纯数字进行des算法加密结果依然得到纯数字
- java将画面中输入的内容,写入到指定的Excel文件的指定的行列中。
- 如何实现图片上面加一层半透明效果,详细请看贴
- 给学Java的大学生们分享一点经验(五)
- Exception in thread "main" java.lang.UnsupportedClassVersionError
- 英语好的进来看看
- 谁和我说说,jdk装好后,环境变量怎么设置?
- 哪位用过 Ronald Tschalär 的 HTTPClient package? 怎么样?
- 关于Applet的数字签名!我太着急了!!
- 新手上路!急急急!!!
- 多线程同步问题
- java面板的问题
你唤醒谁?他们根本不是一个组织的,
public final void notify() 唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。 此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者: * 通过执行此对象的同步实例方法。
* 通过执行在此对象上进行同步的 synchronized 语句的正文。
* 对于 Class 类型的对象,可以通过执行该类的同步静态方法。 一次只能有一个线程拥有对象的监视器。
task.wait();
我要把 task 唤醒丫
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)