JAVA多线程下载问题 80

packagecom.sam.net.download;importjava.io.BufferedInputStream;importjava.io.IOExcepti... package com.sam.net.download;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.swing.JTextArea;

public class DownloadThread extends Thread {
URL url;
long startPos;
long endPos;
boolean done = false;
boolean isstop = false;
RandomAccessFile file = null;
InputStream stream = null;
String filename;
String savaAs;
Search search;
long writePos;

public DownloadThread(URL url, String saveAs, long startPos,long endPos,Search search) throws IOException {
this.url = url;
this.startPos = startPos;
this.endPos = endPos;
this.savaAs = saveAs;
this.search = search;
search.downloaded = 1;
}

public DownloadThread (){

}

public void run() {
while(!isstop){
try {
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setAllowUserInteraction(true);
huc.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);
file = new RandomAccessFile(savaAs, "rw");
file.seek(startPos);
stream = huc.getInputStream();
BufferedInputStream bis = new BufferedInputStream(stream);
byte[] buf = new byte[1024];
int tmp, bytesRead;
tmp = (int)( endPos - startPos);
tmp = (tmp > 1024) ? 1024:tmp;
while ((bytesRead = bis.read(buf, 0, tmp))!= -1 && startPos < endPos) {
file.write(buf, 0, bytesRead);
startPos += bytesRead;
tmp = (int) (endPos - startPos);
tmp = (tmp > 1024) ? 1024:tmp;
search.downloaded += bytesRead;
search.stateChanged();
}
file.close();
bis.close();
done = true;
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

public void setstop(boolean isstiop)
{
this.isstop = isstop;
}
}

这是我的多线程下载的代码,请问我怎么样让他能停下来啊?也就是文件下载的暂停按钮的实现,现在的问题是让我的这个线程能停下来
但是我调用上面的public void setstop(boolean isstiop)
{
this.isstop = isstop;
} 方法怎么也停不下来呢?
展开
 我来答
rffffffff007
2009-02-18 · TA获得超过299个赞
知道小有建树答主
回答量:273
采纳率:0%
帮助的人:360万
展开全部
一般来讲。我会使用
synchronized(this){
this.wait();
}

synchronized(this){
this.notify();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
刚强还静谧灬瑰宝5950
2009-02-18 · TA获得超过744个赞
知道小有建树答主
回答量:359
采纳率:0%
帮助的人:449万
展开全部
################################################
当然停不下来啦。。你的整个读取活动都是在while之内做的,也就是你整个读取活动都没有做完一次循环。。。

##################################################
看好了。。是这样的~~~

你不是实例化线程对象是这样的嘛
DownloadThread aaa = new DownloadThread();
然后直接调用aaa.stop()就可以了。。。

不过。。。一般并发程序的执行是这样的。。。一开始确实是每个线程都打开inputstream。。。但是呢。。run()里面应该是这样的

while( 执行标志 == true ){
读取指定长度的数据流
}

然后对于一个boolean的“执行标志”字段。。弄getter和setter方法作为启动和暂停的标志。。。主线程每次分配指定部分的内容给新线程执行,然后停止。新线程报告执行情况再判断是否继续

这样做是有个原因。。就是java线程是用户级的线程库。。所以有可能因为一个线程而阻塞整个进程。。所以你必须实时记录执行情况。。一旦从错误中恢复,可以从最近的地方开始重新下载。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式