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;
} 方法怎么也停不下来呢? 展开
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;
} 方法怎么也停不下来呢? 展开
2个回答
展开全部
一般来讲。我会使用
synchronized(this){
this.wait();
}
synchronized(this){
this.notify();
}
synchronized(this){
this.wait();
}
synchronized(this){
this.notify();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
################################################
当然停不下来啦。。你的整个读取活动都是在while之内做的,也就是你整个读取活动都没有做完一次循环。。。
##################################################
看好了。。是这样的~~~
你不是实例化线程对象是这样的嘛
DownloadThread aaa = new DownloadThread();
然后直接调用aaa.stop()就可以了。。。
不过。。。一般并发程序的执行是这样的。。。一开始确实是每个线程都打开inputstream。。。但是呢。。run()里面应该是这样的
while( 执行标志 == true ){
读取指定长度的数据流
}
然后对于一个boolean的“执行标志”字段。。弄getter和setter方法作为启动和暂停的标志。。。主线程每次分配指定部分的内容给新线程执行,然后停止。新线程报告执行情况再判断是否继续
这样做是有个原因。。就是java线程是用户级的线程库。。所以有可能因为一个线程而阻塞整个进程。。所以你必须实时记录执行情况。。一旦从错误中恢复,可以从最近的地方开始重新下载。。
当然停不下来啦。。你的整个读取活动都是在while之内做的,也就是你整个读取活动都没有做完一次循环。。。
##################################################
看好了。。是这样的~~~
你不是实例化线程对象是这样的嘛
DownloadThread aaa = new DownloadThread();
然后直接调用aaa.stop()就可以了。。。
不过。。。一般并发程序的执行是这样的。。。一开始确实是每个线程都打开inputstream。。。但是呢。。run()里面应该是这样的
while( 执行标志 == true ){
读取指定长度的数据流
}
然后对于一个boolean的“执行标志”字段。。弄getter和setter方法作为启动和暂停的标志。。。主线程每次分配指定部分的内容给新线程执行,然后停止。新线程报告执行情况再判断是否继续
这样做是有个原因。。就是java线程是用户级的线程库。。所以有可能因为一个线程而阻塞整个进程。。所以你必须实时记录执行情况。。一旦从错误中恢复,可以从最近的地方开始重新下载。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询