求教高手:java中如何暂停一个线程中的任务,在以后的可以恢复之前任务的执行。

如以下程序中,如果run()中执行一个下载任务,但是我希望暂停下载任务,在以后的操作中还可以恢复之前的下载任务,不知道怎么实现,请高手帮帮忙。
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
(Task............)
}
});
thread.start();

可以用以下几种方法:
interrupt():中断线程

stop():强迫线程停止执行。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。

yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。yield()只能使同优先级的线程有执行的机会。----这句是重点

3.书上说yelid()是礼让,是让当前执行线程停下来给别的线程资源, 又说没有任何机制保证会这样。----------没有任何机制保证执行yield()的线程一定会把资源让给其它线程。打个比方:两个人抢东西,A抢到了B没有,再把东西放回去重抢,说不定还是A抢到B没有。没有任何机制保证放回去后B一定能抢到

sleep方法使线程睡眠,但是到一定毫秒数时会自动到cpu中等待
wait方法使线程等待,但是不会自动到cpu中等待,要通过notify或者notifyall方法进行唤醒。

以上是让线程等待的方法,你可以选择适合你程序的方法。追问

以上好像都没有可以实现该功能的方法。

追答

怎么可能,你在run方法中设置比如说sleep方法,过一定的毫秒数的时候不就又自动执行了吗?

追问

问题就是我不要他自动停止,我要通过外部力量让它停止,这种外部力量是随机的,可能有,也可能没有。如果只是单纯的让它自然执行完成后停止当然好办,现在是需要在任务执行过程中,让它停下来。然后再手动让它恢复执行。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-22
暂停线程用wait()方法,开启线程用notifyAll()方法。
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
(Task............)
wait();
}
});
thread.start();
notifyAll();追问

我是希望能通过手动控制run方法的执行。如果Task已经在执行了,在task执行过程中怎么通过外部力量来暂停线程执行,而不是在run()方法中写死方法。我知道可以采用中断,问题是采用中断怎么又没有办法回到之前的任务继续执行了。网上普遍的做法是采用标志位,但是,如何让任务在执行过程中来检测标志位呢?

第2个回答  2014-09-11
请问现在实现了吗,我也遇到了这个需求

求教高手:java中如何暂停一个线程中的任务,在以后的可以恢复之前任务的...
可以用以下几种方法:interrupt():中断线程 stop():强迫线程停止执行。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任...

Java中如何停止一个线程
在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。package chapter2; public class ThreadInterrupt extends Thread { public void run() { try { sleep(50000); \/\/ 延迟5...

怎样在java中关闭多线程其中一个线程?让其他线程还正常运行?
中断线程如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法...

Java中如何终止运行中的线程?while(true){i++;}死循环是如何跳出的?
Java中,终止线程通常意味着在线程处理任务完成之前停止当前操作。有三种方法可以终止正在运行的线程:首先,可以使用volatile标志位。创建一个Runnable接口的实现类,其中定义一个volatile标志位,利用这个标志位控制线程的运行。在main方法中创建线程,适当时候修改标志位以终止线程。其次,可以使用interrupt()方法...

java中ExecutorService的线程池如何暂停所有的任务和继续所有的任务...
在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService 以允许回收其资源。通过创建并返回一个可用于取消执行和\/或等待完成的 Future,方法 submit 扩展了基本方法 Executor.execute(java.lang.Runnable)。方法 invokeAny 和 invokeAll 是批量执行的...

Java中如何正确而优雅的终止运行中的线程
如下:第1个线程创建第2个线程创建第3个线程创建---第2个线程终止第1个线程终止第3个线程终止3、使用interrupt()中断的方式,注意使用interrupt()方法中断正在运行中的线程只会修改中断状态位,可以通过isInterrupted()判断。如果使用interrupt()方法中断阻塞中的线程,那么就会抛出InterruptedException异常,可...

java 如何方法限定一个线程使用?
你可以通过synchronized关键字来限制一个方法只能在一个线程执行。你可以将该方法用synchronized关键字修饰,这样当一个线程在执行这个方法时,其他线程将会被阻塞,直到该线程执行完成,其他线程才能继续执行该方法。例如:public synchronized void myMethod(){ \/\/方法执行的代码 } 这里我们使用synchronized关键...

java中请问如何等待一个线程结束在运行其他的代码?
现在存在两个线程a和b,伪代码如下:在a的代码中:b.start();\/\/启动b线程 synchronized(b) b.wait();\/\/a线程中采用同步,并进行等待 c.execute();在b线程结束时调用synchronized(this) notify();这样就可以达到b不结束,a线程就不会继续执行c。注释:如果看不明白建议先学习一下java线程...

java线程关闭时会执行结束线程的方法吗
重启通常涉及到停止当前运行的Java进程并启动一个新的进程。这通常通过你的操作系统或脚本(如systemd、supervisord、upstart等)来完成。在重启期间,所有未完成的线程将被中止。然而,如果你的应用在重启前可以确保所有的线程都已完成或可以安全地中止,那么这通常不会造成问题。在处理需要长时间运行的任务或...

如何优雅地结束一个线程?
中断线程。1.使用标志 一种简单的方法是使用线程来指示线程是否正在运行,并使用此标志根据您的要求采取纠正措施,下面是一个示例代码,概述了如何使用标志来杀死Java线程。在上面的例子中。我们可以通过将运行变量设置为false来控制执行。在我们的示例中,我们使用AtomicBoolean了并发,如果您不想使用它(不...

相似回答