有关java多线程的问题,闲人免进。

supersonics 2001-04-08 06:03:00
如何让线程在运行固定的一段时间后停止而又不使用stop()方法。
注意,jdk文档上的方法可不行:如果线程在读文件那里停止的话,线程不会按文档上的方法自动退出的,因为该循环判断条件根本就不会被执行到。
...全文
433 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
kz 2001-04-12
  • 打赏
  • 举报
回复
while(true){
sleep(100000);
if(interrupted()) throw new NoSuchMethodError():
}
一样可以中止线程的!只要NoSuchMethodError()方法不能在while循环中被截获就可以了
supersonics 2001-04-11
  • 打赏
  • 举报
回复
to kz:把sleep(..)改为while(true){ sleep(1000);}试试。
如果只是sleep()当然没问题,但是我以为while(true)来模仿线程的停滞更像一些。
to xiaow:当然有同步方法,否则多线程倒变得简单了。
xiaow 2001-04-11
  • 打赏
  • 举报
回复
如果没有用到同步方法的话,用stop()好像也没什么副作用。
kz 2001-04-11
  • 打赏
  • 举报
回复
xiaow的程序是对的!
我试了一下,使用的时间比较长的任务是Thread.sleep(1000000);
也可以这样
{
...
;一个阻塞的任务
if(interrupted()) throw new NoSuchMethodError();
...
}
supersonics 2001-04-11
  • 打赏
  • 举报
回复
程序太长了,不好贴(贴出来也没人能静下心来看)。
谢谢大家的建议。
就这样吧。如果没有更多的意见,明天给分。
breeze的一切 2001-04-10
  • 打赏
  • 举报
回复
用一个进程控制时间(可用sleep方法)然后把一个错误传入要退出的线程,比如除0异常
这样被控制的线程就会因异常而退出(不用stop方法了cool!)
记得给分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
xiaow 2001-04-10
  • 打赏
  • 举报
回复
另外新建一个线程line,在它的run方法里放置打开文件的语句,
然后,在你的程序里插入这段语句

line.start();
try{
line.join(timeout);
}
catch(InterruptedException exception){
}

生成socket对象时如果地址不对也要等很久,我以前就是这么解决的。

hello_wyq 2001-04-10
  • 打赏
  • 举报
回复
实在不行的话,要不把你的程序贴一贴,让大家给你出出注意,光这样讨论我看恐怕是没有结果的
更何况stop()方法是不安全的,能不用的地方就不要用了!
虎叔 2001-04-10
  • 打赏
  • 举报
回复
我觉得你还是应该仔细分析你的代码。看看会造成长时间等待的地方和原因,在采取一定的措施。
如果你不能分析出来,大概只能用stop(),可是会出现资源没有正常释放的问题!
kz 2001-04-10
  • 打赏
  • 举报
回复
给我加分吧!xiaow程序是对的!
xiaow 2001-04-10
  • 打赏
  • 举报
回复
我试了一下,程序停滞时,调用interrupt()方法也无反应。

这个问题不好办。

看来是拿不到分了。55555555555555.....
supersonics 2001-04-10
  • 打赏
  • 举报
回复
xiaow(小为):
看来你还没有认识到我的问题在那里:
如果在你的示例代码中,"do you want to do..."部分程序停滞怎么办?这时while循环的条件根本不会被执行,因而也不可能退出程序(你这个方法和jdk文档提供的方法是类似的)。
虽然上述事件的发生概率较小,但是作为企业级应用,应该考虑到的。
 
xiaow 2001-04-10
  • 打赏
  • 举报
回复
我先前提出的的确没有关闭子线程,不过下面的可以。
新建一个线程line,在它的run方法里这样写:

public void run(){
try{
while(!interrupted()){//判断自己是否最近被中断,以防母线程中断自己时,自己
//未处于睡眠或等待状态。
do you want to do ...;
}
}
catch(InterruptedException e){ //线程睡眠或等待时被中断
}
}

然后,在你的程序里插入这段语句

line.start();
try{
line.join(timeout);
line.interrupt();
}
catch(InterruptedException exception){
}


这样子线程应该被关掉了。
supersonics 2001-04-10
  • 打赏
  • 举报
回复
xiaow(小为):
你的方法还是只能防止主线程的僵死而无法关闭出错的子线程。
wwwlgy(wwwlgy):
你的方法比较独特,但是怎样把一个错误传入要退出的线程呢?分数一定会给的。  
thanx in advance.
i am a java beginner,help me!
hello_wyq 2001-04-10
  • 打赏
  • 举报
回复
看来你是要把你的线程终止掉吧,你当然也可以用方法interrupt();这回可以了把!
supersonics 2001-04-09
  • 打赏
  • 举报
回复
可惜的是我执行的是一个batch线程(里面有很多的步骤),问题在于我不知道这个线程在那个地方停下来;所以你说的方法实际上似乎不可行。
另外,hello_wyq(hobby)说的方法只是让子线程执行若干时间后父线程得以继续执行,而不是终止子线程。
看来,除了stop()外别无他法了。
java在这个方面显得比较差(居然不推荐使用自己的方法又不提供全面的解决方案)。
 
虎叔 2001-04-09
  • 打赏
  • 举报
回复
落叶狂风:
在你的例子中,其实需要解决的问题是何时关闭读文件流。因此你可以制作一个定时器,
在适当的时间后,关闭输入流即可。
这种方法比较简单.
supersonics 2001-04-09
  • 打赏
  • 举报
回复
另外,请教hello_wyq(hobby):该方法如何调用? 
supersonics 2001-04-09
  • 打赏
  • 举报
回复
我并不需要十分精确,但是一定要能把“死掉”的线程终止。
比如如果过了10分钟线程还不停止,就把该线程强行终止。
但是通过信号量的方法可不行,原因我已经说过了:该循环判断根本就不会被执行到。
这个问题本来就不容易解决:jdk文档上都没有办法。
Kert_ake 2001-04-09
  • 打赏
  • 举报
回复
能否试着让另一个线程监控你的线程?
加载更多回复(5)

62,629

社区成员

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

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