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

如何在java中停止一个线程,让同一个线程做另一件事?,java,multithreading,Java,Multithreading,我启动一个线程从互联网下载内容,一次,线程正在下载一个文件,然后我希望它停止并开始下载另一个文件,我该怎么办?我应该依赖java中的并发机制吗?不建议使用方法停止线程 我开始下载一个线程 来自互联网的内容,一次 时间,线程正在下载一个 文件,然后我要它停下来 开始下载另一个文件,什么 我该怎么办 您需要使用Thread类的方法将同一线程暂停指定的毫秒,然后才能使用同一线程继续工作 注意:一旦线程停止,它就无法继续工作。它将导致非法ThreadStateException 见: 不建议使用方法停止

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

不建议使用方法停止线程

我开始下载一个线程 来自互联网的内容,一次 时间,线程正在下载一个 文件,然后我要它停下来 开始下载另一个文件,什么 我该怎么办

您需要使用Thread类的方法将同一线程暂停指定的毫秒,然后才能使用同一线程继续工作

注意:一旦线程停止,它就无法继续工作。它将导致非法ThreadStateException

见:

不建议使用方法停止线程

我开始下载一个线程 来自互联网的内容,一次 时间,线程正在下载一个 文件,然后我要它停下来 开始下载另一个文件,什么 我该怎么办

您需要使用Thread类的方法将同一线程暂停指定的毫秒,然后才能使用同一线程继续工作

注意:一旦线程停止,它就无法继续工作。它将导致非法ThreadStateException

见:


你可以使用一个线程来启动你的线程,然后当你优雅地杀死它,我希望,并启动一个新的线程,它将确保它使用相同的线程

// 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 );
其他有用的文档:


你可以使用一个线程来启动你的线程,然后当你优雅地杀死它,我希望,并启动一个新的线程,它将确保它使用相同的线程

// 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 );
其他有用的文档:


从当前处理中断线程并将其重定向到其他处理是一个典型的同步问题。具体做法如下:

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
}
有一个作业队列。作业队列中的作业[或者更具体地说,作业队列中的对象]应该具有线程将执行的方法[比如进程]。线程通常不知道进程方法的细节。它只关心必须运行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类声明,我想它要么是一个接口,要么是一个抽象类

我还省略了其他线程将添加新作业并通知jobQueueInstance的部分

还省略了有关线程的部分,该部分将中断正在运行的繁忙作业线程


注意线程3和线程4可以是同一个线程。

从当前处理中断线程并将其重定向到其他线程是一个典型的同步问题。具体做法如下:

// 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 );
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
}
有一个作业队列。作业队列中的作业[或者更具体地说,作业队列中的对象]应该具有线程将执行的方法[比如进程]。线程通常不知道进程方法的细节。它只关心必须运行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类声明,我想它要么是一个接口,要么是一个抽象类

我还省略了其他线程将添加新作业并通知jobQueueInstance的部分

还省略了有关线程的部分,该部分将中断正在运行的繁忙作业线程


注意:线程3和线程4可以是同一个线程。

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

// 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 );
除非您使用的软件支持中断或超时设置,否则没有安全的方法强制在外部执行此操作。如果您的目的是尽快关机,则可以安全地使用stop。在这种情况下,System.exit是更好的选择


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

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

除非您使用的软件支持中断或超时设置,否则没有安全的方法强制在外部执行此操作。如果您的目的是尽快关机,则可以安全地使用stop。在这种情况下,System.exit是更好的选择

如果你有一个图书馆,你别无选择,只能
kill,您需要在单独的进程中运行它,并终止整个进程。这将确保操作系统将清理使用的任何资源。假设没有留下临时文件等

您不能将线程变为另一种状态,但可以编写在该线程上运行的代码来执行其他操作。然而,我怀疑这个问题的正确答案是为什么你关心什么线程做什么?你能澄清你的问题吗?您是希望在主线程等待完成时同时启动多个线程(每次下载),还是希望让多个线程下载每个线程,并在主线程需要时停止/重新启动?您无法将线程变为另一种状态,但是您可以编写在线程上运行的代码来执行其他操作。然而,我怀疑这个问题的正确答案是为什么你关心什么线程做什么?你能澄清你的问题吗?您是希望在主线程等待完成的同时启动多个线程同时下载,还是希望让多个线程下载,在主线程需要时停止/重新启动每个线程?这似乎根本无法解决问题。@trutheality:为什么不?它正确地解决了这个问题。我们无法停止线程并重新启动同一个停止的线程。这就是OP想要实现的……我很确定OP所说的停止和使用停止并不相同。我读它是因为我有一个线程在工作,我想告诉它不要再这样做了,因为我想做其他的事情,我如何确保我在重用可用的资源,而不是在我这样做时挂起什么都不做的背景线程?@trutheality:在这种情况下,让OP过来谈谈他到底是什么意思。。。。是的,在您的情况下,您需要开始一个似乎根本无法解决问题的新线程。@trutheality:为什么不呢?它正确地解决了这个问题。我们无法停止线程并重新启动同一个停止的线程。这就是OP想要实现的……我很确定OP所说的停止和使用停止并不相同。我读它是因为我有一个线程在工作,我想告诉它不要再这样做了,因为我想做其他的事情,我如何确保我在重用可用的资源,而不是在我这样做时挂起什么都不做的背景线程?@trutheality:在这种情况下,让OP过来谈谈他到底是什么意思。。。。是的,在您的情况下,您需要开始一个新的线程优雅地终止它==获取未来并调用Future.cancel。有一个使用ExecutorService的一般示例。我将在答案中添加一个简单的示例。优雅地杀死它==获取未来并调用Future.cancel。有一个使用ExecutorService的一般示例。我将在答案中添加一个简单的示例。