如何在java中停止一个线程并让同一个线程做另一件事?

时间:2011-06-10 01:50:54

标签: java multithreading

我启动一个线程从互联网下载内容,一次,线程正在下载一个文件,然后我想停止并开始下载另一个文件,我该怎么办?我应该依靠java中的并发机制吗?

4 个答案:

答案 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
}

我希望这会有所帮助。但是我省略了一些过分简化问题的事情:

  1. 我省略了Job类声明,我猜它将是一个接口或一个抽象类。

  2. 我也省略了其他线程会在new Job()上添加notify()jobQueueInstance的部分。

  3. 还省略了有关interrupt()“繁忙”作业运行线程的线程的部分。

  4. 注意线程3和4可以是相同的线程。

答案 3 :(得分:0)

您应该使用下载软件对下载进行超时。这通常会导致您可以捕获的异常,清理您正在做的事情并继续。

除非您使用的软件支持中断或超时设置,否则无法通过外部强制执行此操作。您可以安全地使用stop(),前提是您的意图是尽快关闭。 (在这种情况下,System.exit()是更好的选择)

如果你有一个你别无选择但只能杀死它的库,你需要在一个单独的进程中运行它并杀死整个进程。这将确保操作系统清理所使用的任何资源。 (假设它没有留下临时文件等;)