需求场景:文件下载(下载,暂停,取消)
这里我们的研究对象时Thread
下载线程Thread 我们暂且叫做 a线程(下载线程)
1.下载
我们只需要开启一个a线程去下载文件资源
下面代码只是模拟下载(下载的具体代码,百度 Google就可以了)
DownloadThread t= new DownloadThread();
t.start();
DownloadThread 类
class DownloadThread extends Thread{
@Override
public void run() {
super.run();
while ("读取文件流"){
// 这里是写文件流的操作
}
}
}
2.暂停下载(其实就是暂停一个线程)
我们如何去停止一个正在下载的线程呢?
1.Thread.stop 这个方法可以停止一个正在运行的线程,不过这种停止线程的操作是不安全的,java 也将这个方法声明为@Deprecated
2.通过自己加标示位,通过标示位来结束run方法,从来结束整个线程
3.Thread.interrupt() 如果你的线程中有Sleep方法则会抛出InterruptedException异常 通过捕获此异常进行终止run方法。如果是非阻塞线程你可以用Thread.currentThread().isInterrupted()状态来结束run方法
java 中的Thread.stop方法
/**
* Requests the receiver Thread to stop and throw ThreadDeath. The Thread is
* resumed if it was suspended and awakened if it was sleeping, so that it
* can proceed to throw ThreadDeath.
*
* @deprecated because stopping a thread in this manner is unsafe and can
* leave your application and the VM in an unpredictable state.
*/
@Deprecated
public final void stop() {
stop(new ThreadDeath());
}
在线程中设置停止标志位
class DownloadThread extends Thread{
boolean isStop;
@Override
public void run() {
super.run();
while (!isStop){
// 这里是读文件流 和写文件流的操作
}
}
public void stopDownload(){
isStop=true;
}
}
方法调用
DownloadThread t= new DownloadThread();
t.start();
t.stopDownload();
使用Thread.interrupt()方法
DownloadThread t= new DownloadThread();
t.start();
t.interrupt();
class DownloadThread extends Thread{
@Override
public void run() {
super.run();
while (!isInterrupted()){
// 这里是读文件流 和写文件流的操作
}
}
}
停止线程池中的线程
ExecutorService mExecutors=Executors.newCachedThreadPool();
//利用mExecutors.submit方法进行开启一个线程 获取到一个Future<?>对象
Future<?> connectThreadFuture=mExecutors.submit(connectThread)
//Future<?>对象提供中断线程的方法cancel 具体参数大家看api解释
connectThreadFuture.cancel(true);//停止线程的方法
自己撸的一个多任务多线程断点下载的库,里面有暂停下载任务就是用了上面的方法,大家可以参考下
https://github.com/qinweiforandroid/QDownload
结束语
文章有什么不对的地方,还请大家斧正.