2011-06-10 59 views
1

我启动一个线程从互联网上下载内容,一次,线程正在下载一个文件,然后我希望它停止并开始下载另一个文件,我该怎么办?我应该指望java中的并发机制吗?如何在java中停止一个线程并让同一个线程去做另一件事?

+0

你不能魔术一个线程进入另一种状态,但您可以编写线程上运行,否则做一些代码。不过,我怀疑这个问题的正确答案是“你为什么在乎线程做了什么?” – 2011-06-10 01:55:06

+1

你能澄清你的问题吗?你想在主线程等待它们完成的时候同时启动多个线程,或者你想让多线程下载每个线程,当主线程想要时可以暂停/重新启动它们? – Bohemian 2011-06-10 02:11:59

回答

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

杀死它优雅==获得未来调用'Future.cancel'。 – jtahlborn 2011-06-10 03:08:12

+0

是否有任何代码演示? – David 2011-06-12 16:33:23

+0

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html有一个使用'ExecutorService'的通用示例。我将在一个简单的例子中添加答案。 – trutheality 2011-06-12 18:47:00

0

不建议使用stop()方法停止线程。

我开始一个线程从网上下载 内容,在一个 时间,线程下载一个 文件,然后我希望它停止 开始下载其他文件,我应该怎么做 ?

您需要使用Thread类的sleep()方法暂停同一个线程对某些特定milliseconds,然后才能继续使用相同的线程的工作。


注意:一旦线程已经停止,就不能恢复其工作。它将导致IllegalThreadStateException

参见:

+0

这似乎并没有解决这个问题。 – trutheality 2011-06-10 01:57:57

+0

@trutheality:为什么不呢?它正确地解决了这个问题。我们无法停止线程并再次重新启动相同的停止线程。这是OP试图实现的...... – 2011-06-10 01:59:41

+0

我很确定OP所说的“停止”与“使用stop()”不一样。我把它理解为“我有一个线程正在工作,我想告诉它不要再那么做了,因为我想要做其他事情,我如何确保我重用了可用的资源,当我这样做时没有后台线程?“ – trutheality 2011-06-10 02:04:40

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. 我也省略了一些其他线程将在jobQueueInstance上添加new Job()notify()的部分。

  3. 也省略了有关线程将interrupt()“忙”的工作运行的线程的一部分。

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

0

你应该使用该软件的下载将超时上下载。这通常会导致您可以捕获的异常,清理您正在执行的操作并继续。

除非您使用支持软件中断或超时设置,也没有安全的方式来迫使这对外部发生。如果您的意图是尽快关闭,您可以安全地使用stop()。 (在这种情况下,System.exit()的是一个更好的选择)

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

相关问题