有办法给一个方法设置超时时间不

zdx1314 2014-09-02 07:00:10
方法 F() ,当我想让F最多执行一分钟,如果一分钟还没结束就继续往下走,运行后面的代码

实际情况中F很快就可以结束,现在有的时候会出异常,导致F很久都执行不完,导致后面的流程延迟太大的



...全文
352 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_19250161 2014-09-10
  • 打赏
  • 举报
回复
用new Date 获取当前系统时间判断 不可以吗?
HinanaiTenshi 2014-09-09
  • 打赏
  • 举报
回复
那就找到很久执行不完的问题所在啊,别人都是把复杂问题简单化,lz你打算把简单问题复杂化。 java里最容易导致莫名其妙异常的就是多线程了,稳定性最难判断的也是多线程。
ws_cc 2014-09-09
  • 打赏
  • 举报
回复
用休眠不能彻底解决问题,这样的话虽然暂时的休眠了线程,但实质上这个线程并没有结束.
  • 打赏
  • 举报
回复
用线程,休眠啊,sleep
yxsmzzwa 2014-09-07
  • 打赏
  • 举报
回复
这样也并不一定在一分钟内结束,如果非得一分钟内结束,调用Thread.stop(),但这个不安全
yxsmzzwa 2014-09-07
  • 打赏
  • 举报
回复
实际情况中F很快就可以结束,现在有的时候会出异常。。。。。 还是研究下为什么会变慢的好,看看那几行代码有问题,能不能避免 根据情况可以在主线程启动一个新线程运行F()。 或F()里面开一个新线程来运行耗时的操作。 第二种方法更好,不过要知道F()的到底是如何实现的。 随便举一个例子: 有错误请指正


import java.util.logging.Level;
import java.util.logging.Logger;


class MainThread {

    public void good(){
        //启动一个线程执行F()方法
        Worker w = new Worker("运行F()", this);
        w.start();
        //等等10秒
        synchronized (this) {
            try {
                wait(10000);
            } catch (InterruptedException ex) {
                Logger.getLogger(MainThread.class.getName()).log(Level.SEVERE, null, ex);
            }
            w.shutdown();
        }
    }
    
    public void F() throws InterruptedException{
        System.out.println("玩游戏");
      //做一些事情
      //如果会InterruptedException异常
      //Thread.sleep(1000000);
    }

    private class Worker extends Thread {

        private final MainThread mt;

        public Worker(String name, MainThread mt) {
            super("线程名字是" + name);
            this.mt = mt;
        }
 
        public final void shutdown() {
            interrupt();
        }

        @Override
        public final void run() {
            try {
                mt.F();
            } catch (InterruptedException ex) {
                //Logger.getLogger(Worker.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                //唤醒主线程。
                synchronized(mt) {
                    mt.notify();
                }
            }
        }
    }
    public static void main(String[] args) {
        MainThread mt = new MainThread();
        mt.good();
    }
}
a12939026 2014-09-02
  • 打赏
  • 举报
回复
1楼的方法可实现,也可用CountDownLatch,一样的。 另外若工作线程会占用大量资源或者可能死循环,可用Thread.interrupt 方法中断它
rumlee 2014-09-02
  • 打赏
  • 举报
回复
这要看F方法的代码自己是否能够控制,如果不能控制的话,则只能采用一楼的这种办法。 如果F方法的代码自己可以控制的话,则可以另起一个线程,循环判断,如果时间一分钟到了,而F还没有执行完成的话,通知F不要执行了,继续执行后面的代码。
skgary 2014-09-02
  • 打赏
  • 举报
回复
另启一个线程,执行F(),结束之后,notify 原来的线程,同时再判断一下执行时间,如果超时的话就不要再做下去了。 原来的线程wait(60000L)

62,623

社区成员

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

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