【发布时间】:2015-11-26 13:59:36
【问题描述】:
我目前有一个在你按下 GUI 上的按钮时启动的踏板,这个线程基本上开始下载文件,但我想实现你可以停止踏板,这在 t.suspend(); 上工作得很好,但它已被弃用,所以我尝试使用t.wait();和t.notify();,问题是每次我尝试暂停时,等待的人都会抛出异常“线程“AWT-EventQueue-0”java.lang.IllegalMonitorStateException中的异常”它。
开始下载按钮:
t = new TestTread();
t.start();
暂停:
try {
t.wait();
} catch (InterruptedException ex) {
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
继续:
t.notify();
线程类
public class DownloaderThread extends Thread{
@Override
public void run(){
Download();
}
public void Download() {
URL url = new URL(ftpUrl);
URLConnection conn = url.openConnection();
InputStream inputStream = conn.getInputStream();
FileOutputStream outputStream = new FileOutputStream(savePath);
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
inputStream.close();
}
下载工作正常,下载文件没有任何错误,只是我无法使用 t.wait 停止线程。 我做错了什么还是我以错误的方式实现了等待?
【问题讨论】:
-
中断线程。
-
您应该阅读
wait()/notify()机制实际上是什么。它不是一种“暂停”机制(尽管它可以用来实现)。 -
您误解了
wait()。这不会暂停你调用它的线程/对象,它会让调用它的线程休眠。它会一直休眠,直到有人在那个确切的对象上调用notifly()! -
我不认为 OP 描述的中断就足够了。我建议构建一种类型的前/后条件集,其中线程仅在满足条件的情况下才会执行。
标签: java multithreading