当前位置: 技术问答>java相关
有关java多线程的问题,闲人免进。
来源: 互联网 发布时间:2014-12-29
本文导语: 如何让线程在运行固定的一段时间后停止而又不使用stop()方法。 注意,jdk文档上的方法可不行:如果线程在读文件那里停止的话,线程不会按文档上的方法自动退出的,因为该循环判断条件根本就不会被执行到。 ...
如何让线程在运行固定的一段时间后停止而又不使用stop()方法。
注意,jdk文档上的方法可不行:如果线程在读文件那里停止的话,线程不会按文档上的方法自动退出的,因为该循环判断条件根本就不会被执行到。
注意,jdk文档上的方法可不行:如果线程在读文件那里停止的话,线程不会按文档上的方法自动退出的,因为该循环判断条件根本就不会被执行到。
|
如果时间不是要求特别严格,可以参照定时器的做法!
定时器时间到,给需要退出的线程发消息,告诉它现在可以退出了。
明白了吗?可以解决你的问题吗?
定时器时间到,给需要退出的线程发消息,告诉它现在可以退出了。
明白了吗?可以解决你的问题吗?
|
用下面方法:
public final synchronized void join(long millis)
throws InterruptedException
说明:
millis是指当用了millis毫秒后线程退出.如果millis == 0的话,表示永远不退出。
public final synchronized void join(long millis)
throws InterruptedException
说明:
millis是指当用了millis毫秒后线程退出.如果millis == 0的话,表示永远不退出。
|
上面的方法好像没有作用啊!
|
另外新建一个线程line,在它的run方法里放置打开文件的语句,
然后,在你的程序里插入这段语句
line.start();
try{
line.join(timeout);
}
catch(InterruptedException exception){
}
生成socket对象时如果地址不对也要等很久,我以前就是这么解决的。
然后,在你的程序里插入这段语句
line.start();
try{
line.join(timeout);
}
catch(InterruptedException exception){
}
生成socket对象时如果地址不对也要等很久,我以前就是这么解决的。
|
用一个进程控制时间(可用sleep方法)然后把一个错误传入要退出的线程,比如除0异常
这样被控制的线程就会因异常而退出(不用stop方法了cool!)
记得给分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这样被控制的线程就会因异常而退出(不用stop方法了cool!)
记得给分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
我先前提出的的确没有关闭子线程,不过下面的可以。
新建一个线程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){
}
这样子线程应该被关掉了。
新建一个线程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){
}
这样子线程应该被关掉了。
|
精确的退出而不用stop(),可能不行。
|
海盗是对的。不过,由于你只有一个CPU,所以可能不一定会非常精确。
|
落叶狂风:
在你的例子中,其实需要解决的问题是何时关闭读文件流。因此你可以制作一个定时器,
在适当的时间后,关闭输入流即可。
这种方法比较简单.
在你的例子中,其实需要解决的问题是何时关闭读文件流。因此你可以制作一个定时器,
在适当的时间后,关闭输入流即可。
这种方法比较简单.
|
能否试着让另一个线程监控你的线程?
|
看来你是要把你的线程终止掉吧,你当然也可以用方法interrupt();这回可以了把!
|
我觉得你还是应该仔细分析你的代码。看看会造成长时间等待的地方和原因,在采取一定的措施。
如果你不能分析出来,大概只能用stop(),可是会出现资源没有正常释放的问题!
如果你不能分析出来,大概只能用stop(),可是会出现资源没有正常释放的问题!
|
实在不行的话,要不把你的程序贴一贴,让大家给你出出注意,光这样讨论我看恐怕是没有结果的
更何况stop()方法是不安全的,能不用的地方就不要用了!
更何况stop()方法是不安全的,能不用的地方就不要用了!
|
xiaow的程序是对的!
我试了一下,使用的时间比较长的任务是Thread.sleep(1000000);
也可以这样
{
...
;一个阻塞的任务
if(interrupted()) throw new NoSuchMethodError();
...
}
我试了一下,使用的时间比较长的任务是Thread.sleep(1000000);
也可以这样
{
...
;一个阻塞的任务
if(interrupted()) throw new NoSuchMethodError();
...
}