首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java中超时程序的兑现

2012-09-14 
java中超时程序的实现在java中可以使用ExecutorService搭配Futrue来实现超时程序,FutureTask实现了Future

java中超时程序的实现

在java中可以使用ExecutorService搭配Futrue来实现超时程序,FutureTask实现了Future接口,直接上代码:

package com.test;

?

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.FutureTask;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.TimeoutException;

?

public class FutureTest {

?

public static void main(String[] a){

ExecutorService service = Executors.newSingleThreadExecutor();

FutureTask<String> task = new FutureTask<String>(new Callable<String>() {

@Override

public String call() throws Exception {

try {

Thread.sleep(6000);

} catch (InterruptedException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

System.out.println("hello");

return null;

}

});

service.submit(task);

try {

task.get(5000, TimeUnit.MILLISECONDS);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ExecutionException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (TimeoutException e) {

System.out.println("over");

}finally{

service.shutdown();

}

}

}


这段程序的输出为over \n hello,下面我来解释下这段程序,

?

FutureTask的get(long timeout,TimeUnit unit)方法的作用是,如果在规定的timeout时间内future中的任务如果还没有执行完成,则此时抛出TimeoutException,因为我在call方法中设定使当前任务所在线程停止6秒,当停止到第5秒的时候任务已经超时,所以就进入了超时异常程序处理块,所以此时会打印over,但由于线程调度器中发现还有线程没有终结,所以要等到线程调度器中所有线程执行完成之后才能shutdown,所以在第6秒的时候会打印hello,当所有线程都执行完后,程序就退出了。

?

?

?

热点排行