如何使用Java的Runtime.exec时添加一个超时值

如何使用Java的Runtime.exec时添加一个超时值,第1张

首先说点Runtime类吧,他是一个与JVM运行时环境有关的类,这个类是Singleton的。我说几个自己觉得重要的地方。

1、Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法

2、Runtime上其他大部分的方法都是实例方法,也就是说每次进行运行时调用时都要用到getRuntime方法。

3、 Runtime中的exit方法是退出当前JVM的方法,估计也是唯一的一个吧,因为我看到System类中的exit实际上也是通过调用 Runtime.exit()来退出JVM的,这里说明一下Java对Runtime返回值的一般规则(后边也提到了),0代表正常退出,非0代表异常中 止,这只是Java的规则,在各个 *** 作系统中总会发生一些小的混淆。

4、Runtime.addShutdownHook()方法可以注册一个hook在JVM执行shutdown的过程中,方法的参数只要是一个初始化过但是没有执行的Thread实例就可以。(注意,Java中的Thread都是执行过了就不值钱的哦)

5、 说到addShutdownHook这个方法就要说一下JVM运行环境是在什么情况下shutdown或者abort的。文档上是这样写的,当最后一个非 精灵进程退出或者收到了一个用户中断信号、用户登出、系统shutdown、Runtime的exit方法被调用时JVM会启动shutdown的过程, 在这个过程开始后,他会并行启动所有登记的shutdown hook(注意是并行启动,这就需要线程安全和防止死锁)。当shutdown过程启动后,只有通过调用halt方法才能中止shutdown的过程并退 出JVM。

可以。

URLConnection里面有一个setConnectionTimeout(int timeout)

* @param timeout an {@code int} that specifies the connect

* timeout value in milliseconds

java 1.5以上的Future类可以执行超时处理。

jdk1.5自带的并发库中Future类中重要方法包括get()和cancel(),get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据,而 cancel()是取消数据加载。另外一个get(timeout) *** 作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞。

代码如下:

import java.util.concurrent.Callable

import java.util.concurrent.ExecutionException

import java.util.concurrent.ExecutorService

import java.util.concurrent.Executors

import java.util.concurrent.TimeUnit

import com.sun.corba.se.impl.orbutil.closure.Future

import com.sun.corba.se.impl.orbutil.threadpool.TimeoutException

public class ThreadTest {  

  

    public static void main(String[] args) throws InterruptedException,  

            ExecutionException {  

          

        final ExecutorService exec = Executors.newFixedThreadPool(1)  

          

        Callable<String> call = new Callable<String>() {  

            public String call() throws Exception {  

                //开始执行耗时 *** 作  

                Thread.sleep(1000 * 5)  

                return "线程执行完成."  

            }  

        }  

          

        try {  

            Future<String> future = exec.submit(call)  

            String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS) //任务处理超时时间设为 1 秒  

            System.out.println("任务成功返回:" + obj)  

        } catch (TimeoutException ex) {  

            System.out.println("处理超时啦....")  

            ex.printStackTrace()  

        } catch (Exception e) {  

            System.out.println("处理失败.")  

            e.printStackTrace()  

        }  

        // 关闭线程池  

        exec.shutdown()  

    }  

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11707816.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存