日期:2014-05-20  浏览次数:20804 次

如何安全结束一个访问网络的线程
最近做个程序,要利用webservice 从一个服务器上下载文件,client用的是Axis2。
不用线程速度有点慢,于是改为多线程来实现,每个线程只下5MB数据,根据偏移值获取不同的byte[],然后组装成一个整体的文件。(不支持断点续传)
现有需求,在下载过程中,如果取消下载,如何才能安全关闭正在下载的线程,比如一个线程已下载了1MB,还4MB没下载,此时要取消下载,这个怎么才能把线程停下来?

我试了interrupt,interrupt 后线程还是在下载。如果用stop(已经不推荐使用了),stop程序就会卡住(奇怪的问题). 

求教各位大虾怎么才能安全停住此线程?

run方法

Java code

public void run(){
    byte[] block_bytes=Axis2SoapManager.getBlocks(offset,length);
    FileManager.writeFile(offset,block_bytes);
    
    Thread.sleep(100);
}catch(InterruptedException iex){
    //
}catch(IOException ioe){
    //
}



------解决方案--------------------
通过抛出异常修改循环标志~
------解决方案--------------------
自己写一个循环的标志吧
------解决方案--------------------
你上面的是Runnable?
不要使用new Thread(new Runnable()) 这种方法启动。
提交到一个 ExecutorService.

class XXX implements Runnable{...}

ExecutorService service = Executors.newCachedThreadPool();

Future<?> future = service.submit(new XXX());

// 放弃
future.cancel(true);

service.shutdown();
------解决方案--------------------
7楼正解
jdk从1.5开始已经增加了java.util.concurrent这个并发的专用类包,不知道为什么都不去用,非要自己写多线程去,还写不明白