如何暂停一个运行中的线程

yuieyuiriei76YH 2010-02-23 01:17:48
现在有2个线程,thread1和thread2,通过thread1来控制thread2,thread1来接受命令,如果需要暂停thread2,那么就在thread1里执行一个方法来暂停thread2,而不是通过在thread2里由thread2自己通过一个状态来暂停自己,也就是说thread2一直在运行,它不知道该什么时候暂停,而是由thread来控制的。就相当于自定义一个和Thread.suspend一样的方法,因为Thread.suspend被丢弃了,所以想自定义一个和Thread.suspend一样功能的方法,哪位高手能提供实现这个功能的方法?谢谢!
...全文
360 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
nj_dobetter 2010-02-24
  • 打赏
  • 举报
回复
wait() 配合 notify()
zhuyouyong 2010-02-24
  • 打赏
  • 举报
回复
从api中查到一个已经过时的方法,不明白如何暂停
sinpinle 2010-02-24
  • 打赏
  • 举报
回复
同意火龙果说的,需要抛出interrupt可以中断线程
记得好像还可以用Semaphore处理(不是太清了,具体网上找吧)
qingyuan18 2010-02-23
  • 打赏
  • 举报
回复

public class ScheduledTask implements Runnable {

public void startService(){
run();
}
public void run()
{
synchronized(this)
{
while(!this.flag)
{
try
{
wait();
}
catch(InterruptedException e)
{

}
}
}
try
{
//线程主操作
}
catch (Exception e)
{
e.printStackTrace();
}

}
public synchronized void stop()
{
this.flag = false;
}
public synchronized void restart()
{
this.flag = true;
notify();
}


holsten32 2010-02-23
  • 打赏
  • 举报
回复

回复内容太短了!
回复内容太短了!
回复内容太短了!
回复内容太短了!
回复内容太短了!
solosky772 2010-02-23
  • 打赏
  • 举报
回复
线程只有在wait()的时候才响应中断,其他情况,如运行中和IO阻塞都不会响应中断。
stu202060510 2010-02-23
  • 打赏
  • 举报
回复
通常用我们用
while(true){
....
}

如果需要对线程进行控制,可改写为
private Boolean flag=true;
while(flag){
....
}
通过提供public void setFlag(boolean flag)方法来控制其停止或继续运行
  • 打赏
  • 举报
回复
加开关是一种解决方案,但并不是万能的。

比如:

for(;;)
{
if(主线程开关)
{
.... // 有一个阻塞的方法,会阻塞的方法都有个特点,就是会抛出 InterruptedException 异常。
}
}


这时应采用 Thread#interrupt 进行中断
xiesisi3 2010-02-23
  • 打赏
  • 举报
回复
路过学习。。。。。
回复内容太短了!
kokobox 2010-02-23
  • 打赏
  • 举报
回复
引用 4 楼 hejinjing_tom_com 的回复:
2楼似乎效率太低。
控制线程的运行,c/c++采用系统api 进行, java 应该提供相应的api,关注!


会太低?


for(;;)
{
if(主线程开关)
{
//操作
}

}



“太”低在那里?
yuieyuiriei76YH 2010-02-23
  • 打赏
  • 举报
回复
谢谢大家!可能我的描述有问题,导致5楼误解了,其实通过thread2.suspend可以暂停thread2这个线程,但是在java api里对于suspend这个方法是不赞成使用的,怕引起死锁,在thread1获得cpu运行时间时,运行thread2.suspend,那么thread2就退出cpu运行队列了,只有通过在thread1里运行thread2.resume那么thread2才能重新进入cpu运行队列了,并且thread2是紧接着暂停前的继续执行,那么现在是否只有通过suspend才能实现这个功能?
2到20个英文 2010-02-23
  • 打赏
  • 举报
回复
引用 5 楼 bao110908 的回复:
你的概念就是不对的,正在运行中的线程是无法停止的。不要试图认为主线程就能控制其他所有的子线程。

线程的停止只能是请求式的,而不是命令式的。至于线程是否愿意停止完全由线程自己说了算,其他线程是无法控制的。比如,某一线程在计算 int 内所有的质数,其在运行中是很难停止,除非增加一些标记变量,或者在有可能抛出 InterruptedException 异常的地方,使用 Thread#interrupt() 来进行中断。

....
  • 打赏
  • 举报
回复
你的概念就是不对的,正在运行中的线程是无法停止的。不要试图认为主线程就能控制其他所有的子线程。

线程的停止只能是请求式的,而不是命令式的。至于线程是否愿意停止完全由线程自己说了算,其他线程是无法控制的。比如,某一线程在计算 int 内所有的质数,其在运行中是很难停止,除非增加一些标记变量,或者在有可能抛出 InterruptedException 异常的地方,使用 Thread#interrupt() 来进行中断。
hjjdebug 2010-02-23
  • 打赏
  • 举报
回复
2楼似乎效率太低。
控制线程的运行,c/c++采用系统api 进行, java 应该提供相应的api,关注!
pwl2014 2010-02-23
  • 打赏
  • 举报
回复
2楼正解,2楼正解,2楼正解
kokobox 2010-02-23
  • 打赏
  • 举报
回复
可以用一个值制定开关,线程2监听变量值。

线程1去更新或改动变量值

LuffySY 2010-02-23
  • 打赏
  • 举报
回复

mark .

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧