java 多线程如何让程序运行一定时间后停止

如题所述

你说的应该不是sleep吧。呵呵,
这么简单的话,就没必要在这里问了。
我猜测呢,你是要在多线程计时任务
Task线程里面有个while循环?
那么你需要一个TimerTask 来控制这个线程,也就是计时线程。
那么这个计时线程,有两种方法~
第一种,比较不讲究的方法,也就是,对结果处理不好的方式,类似于过时方法的stop,就是把你的Task线程在TimerTask里面启动。
TimerTask里面类似于
while(true){
Task.start();
Date date = new Date();
while(true){
计算时间差,如果时间差大于超时时间,则break


而在Task线程中,需要加上一行代码
this.setDeamon(true);
将这个task任务设置成后台线程。
因为是TimerTask启动的这个后台任务线程, 一旦超时,那么,这个后台线程Task将会被强制shutdown 。
这种方式适用于不怎么严格的线程要求。

还有一种呢,就是比较严格,对后台处理要求很高的那种。
就是两个线程中需要有共享的变量,将结果,运行状态,都要共享,当TimerTask发现超时的时候,会判断Task线程的处理结果。以及运行状态,而做出相应的处理。

你问的问题比较宽泛。所以,我只能大致的把思路给介绍一下。
如果,能牵扯到实际的问题,那样就容易判断用那种方式的线程超时机制比较好了。呵呵
最后,节日愉快~~

参考资料:手打

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-08-25


import static java.util.concurrent.TimeUnit.*;
class BeeperControl {
   private final ScheduledExecutorService scheduler =
     Executors.newScheduledThreadPool(1);

   public void beepForAnHour() {
     final Runnable beeper = new Runnable() {
       public void run() { System.out.println("beep"); }
     };
     final ScheduledFuture<?> beeperHandle =
       scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
     scheduler.schedule(new Runnable() {
       public void run() { beeperHandle.cancel(true); }
     }, 60 * 60, SECONDS);
   }
 }

一个使用ScheduledExecutorService的例子。每十秒输出一次beep,一小时后停止。

第2个回答  2010-10-06
给你一个完整的吧。
public class sleepAndStart implements Runnable{
boolean run=true;
int i=0;
sleepAndStart(){}
public void run() {
while(run){
if(i<20){
i++;
System.out.println("hello."+i);
try {
Thread.sleep(200);//执行上面两段语句后睡200毫秒
} catch (InterruptedException e) {}
}else{
run=false;
}
}
}
public static void main(String[] args){
sleepAndStart sas=new sleepAndStart();
Thread thread=new Thread(sas);
thread.start();
}
}
第3个回答  2010-09-24
Thread.sleep(时间 毫秒单位);
注意运行他是会抛错!InterrputedException本回答被网友采纳
第4个回答  2010-09-24
try{
Thread.sleep(2000);
}catch(InterruptedException e){
e.printStackTrace()
}

java 多线程如何让程序运行一定时间后停止
第一种,比较不讲究的方法,也就是,对结果处理不好的方式,类似于过时方法的stop,就是把你的Task线程在TimerTask里面启动。TimerTask里面类似于 while(true){ Task.start();Date date = new Date();while(true){ 计算时间差,如果时间差大于超时时间,则break } } 而在Task线程中,...

Java线程停止的方法,及stop等方法为什么被废弃
在 Java 中有以下 3 种方法可以终止正在运行的线程:停止一个线程的推荐做法是修改某些变量以指示目标线程应停止运行。 目标线程应定期检查此变量,如果该变量指示要停止运行,则应有序地从其运行方法返回。 这是为了确保对 stop-request 进行及时的通信,变量必须是 volatile 或者必须同步访问变量。使用 ...

如何在 Java 中正确使用 wait,notify 和 notifyAll
一旦你在debug模式下启动程序,它会停止在PRODUCER或者 CONSUMER线程上,取决于哪个线程占据了CPU。因为两个线程都有wait()的条件,它们一定会停止,然后你就可以跑这个程序然后看发生什么了 (很有可能它就会输出我们以上展示的内容)。你也可以使用Eclipse里的Step into和Step over按钮来更好地理解多线程间发生的事情。本...

java中终止程序的执行
(1)让程序在一个单独的线程中运行,然后在终止时,可以用线程的终止方法来结束它。(2)退出Java程序时尽量不要使用java.lang.System的exit方法。Exit 方法可以终止JVM,从而终止程序,但如果同时运行了另一个Java程序,使用exit方法就会让该程序也关闭,这显然不是希望看到的情况!!!要退出Java程序,...

关于Java线程超时退出的问题.
你在捕捉到的异常中,调用一下线程的interrupt()方法就可以对线程进行中断,当然,你的线程中的run方法中不能catch了interrupt()异常并且忽视这个异常。比如在出现异常的地方:threadA.interrupt();而threadA的run方法中:public void run() { while(true) { try { ...} catch (InterruptedException) ...

如何用Java比较安全的停止一个Windows由Java应用程序调用的外部程序进程...
办法肯定有啦,最武断的办法就是直接调用Process类的destroy方法,该子进程就被杀死。当然这是最底层的办法,使用中还需要包装,比如用循环和sleep来计时,超时了才调用destroy。也可以根据实际情况,做成异步调用(让这个进程在单独的线程中运行),这样你的主程序就不会被挂起了。以上这些包装,其实在...

Java多线程问题总结?
试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。(3)便于建模 这是...

java多线程并发的问题
JAVA程序线程的运行:在我们使用java命令来运行程序时,这时候已经开始了两个线程,一个是main()方法的线程,一个是垃圾回收的线程。当楼主调用start方法开启另外两个线程时。这时候由于CPU来决定运行哪个线程。所以虽然noet1是先开启的,但在执行noet1时,CPU可能又去跑去执行main线程了,然后就会开启...

Java多线程实战|CountDownLatch原理介绍及使用场景
运行上述代码,所有线程将在主线程调用`countDown`后同时开始执行任务,实现最大并行性。总结,CountDownLatch在多线程编程中是一个十分实用的工具,尤其在需要控制线程执行顺序或同步多个线程开始执行任务的场景。正确理解和运用CountDownLatch,能够提高代码的可读性和效率,确保程序在复杂多线程环境下稳定运行...

java sleep和wait有区别么
10. join()方法使当前线程停下来等待,直至另一个调用join方法的线程终止。11. 值得注意的是:线程在被激活后不一定马上就运行,而是进入到可运行线程的队列中。12. 共同点:他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。13. 不同点:Thread.sleep(long)可以不在...

相似回答