我启动一个线程从互联网下载内容,一次,线程正在下载一个文件,然后我想停止并开始下载另一个文件,我该怎么办?我应该依靠java中的并发机制吗?
答案 0 :(得分:4)
你可以使用single-thread executor开始你的线程,然后当你杀了它(我希望优雅地)并开始一个新线程时它将确保它使用相同的线程。
// Suppose you have a DownloadFile class that implements Runnable
DownloadFile task1 = new DownloadFile();
...
ExecutorService exec = Executors.newSingleThreadExecutor();
Future<Boolean> future = exec.submit( task1, Boolean.TRUE );
...
// Cancel the task
future.cancel();
// Give the executor another task
DownloadFile task2 = new DownloadFile();
...
exec.submit( task2, Boolean.TRUE );
其他有用的文档:
答案 1 :(得分:0)
建议不要使用stop()
方法停止线程。
我开始下载一个帖子 来自互联网的内容,在一个 时间,线程正在下载一个 文件,然后我希望它停止和 开始下载另一个文件,什么 我该怎么办?
您需要使用Thread
类的sleep( )方法为某些指定的milliseconds
暂停相同的线程,然后才能继续使用同一个线程。
注意:一旦线程停止,它就无法恢复工作。它将导致IllegalThreadStateException 。
见:
答案 2 :(得分:0)
从当前处理中断线程并将其重定向到其他位置是典型的同步问题。这样做如下:
有一个工作队列。作业队列中的作业[或者更具体地说是作业队列中的对象]应该具有线程将执行的方法[比如process()]。线程通常不知道process()方法的细节。它只关心它必须运行process()方法。
线程必须在作业队列上等待。这样做如下:
Job j = null;
synchronized(jobQueueInstance)
{
if(jobQueueInstance.isEmpty())
{
jobQueueInstance.wait();
}
j = jobQueueInstance.poll(); //get the job from the head of the queue
}
try
{
j.process();
}
catch(InterruptedException ex)
{
//thread is interrupted, means it needs to abandon this job and fetch a new one from the queue
}
我希望这会有所帮助。但是我省略了一些过分简化问题的事情:
我省略了Job
类声明,我猜它将是一个接口或一个抽象类。
我也省略了其他线程会在new Job()
上添加notify()
和jobQueueInstance
的部分。
还省略了有关interrupt()
“繁忙”作业运行线程的线程的部分。
注意线程3和4可以是相同的线程。
答案 3 :(得分:0)
您应该使用下载软件对下载进行超时。这通常会导致您可以捕获的异常,清理您正在做的事情并继续。
除非您使用的软件支持中断或超时设置,否则无法通过外部强制执行此操作。您可以安全地使用stop(),前提是您的意图是尽快关闭。 (在这种情况下,System.exit()是更好的选择)
如果你有一个你别无选择但只能杀死它的库,你需要在一个单独的进程中运行它并杀死整个进程。这将确保操作系统清理所使用的任何资源。 (假设它没有留下临时文件等;)