java自定义任务类定时执行任务示例callable和future接口使用方法
Callable和Future接口
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
Callable和Runnable有几点不同:
(1)Callable规定的方法是call(),而Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
(3)call()方法可抛出异常,而run()方法是不能抛出异常的。
(4)运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。
它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
packagecom.yao;
importjava.util.concurrent.Callable;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importjava.util.concurrent.Future;
publicclassCallableAndFuture{
/**
*自定义一个任务类,实现Callable接口
*/
publicstaticclassMyCallableClassimplementsCallable{
//标志位
privateintflag=0;
publicMyCallableClass(intflag){
this.flag=flag;
}
publicStringcall()throwsException{
if(this.flag==0){
//如果flag的值为0,则立即返回
return"flag=0";
}
if(this.flag==1){
//如果flag的值为1,做一个无限循环
try{
while(true){
System.out.println("looping......");
Thread.sleep(2000);
}
}catch(InterruptedExceptione){
System.out.println("Interrupted");
}
return"false";
}else{
//falg不为0或者1,则抛出异常
thrownewException("Badflagvalue!");
}
}
}
publicstaticvoidmain(String[]args){
//定义3个Callable类型的任务
MyCallableClasstask1=newMyCallableClass(0);
MyCallableClasstask2=newMyCallableClass(1);
MyCallableClasstask3=newMyCallableClass(2);
//创建一个执行任务的服务
ExecutorServicees=Executors.newFixedThreadPool(3);
try{
//提交并执行任务,任务启动时返回了一个Future对象,
//如果想得到任务执行的结果或者是异常可对这个Future对象进行操作
Futurefuture1=es.submit(task1);
//获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行
System.out.println("task1:"+future1.get());
Futurefuture2=es.submit(task2);
//等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环
Thread.sleep(5000);
System.out.println("task2cancel:"+future2.cancel(true));
//获取第三个任务的输出,因为执行第三个任务会引起异常
//所以下面的语句将引起异常的抛出
Futurefuture3=es.submit(task3);
System.out.println("task3:"+future3.get());
}catch(Exceptione){
System.out.println(e.toString());
}
//停止任务执行服务
es.shutdownNow();
}
}
相关文章
- java解析xml方法_详解Java解析XML的四种方法
- java抽象类和抽象方法[通俗易懂]
- java switch用法_Java switch语句
- java 异步调用接口_Java接口异步调用[通俗易懂]
- java启动器_JAVA基础:Java 启动器如何查找类
- java的运行环境是什么_Java运行环境是什么
- java数组去重_JAVA数组去重常用方法
- java递归和迭代_Java中的迭代与递归
- java网页安全提示_win7系统打开网页提示“应用程序已被JAVA安全阻止”的解决方法…
- java 随机数算法_Java随机数算法原理与实现方法实例详解
- java验证手机号正则表达式_Java使用正则表达式验证手机号和电话号码的方法「建议收藏」
- Java遍历json_java处理json数据
- java 设置400错误_Java项目报400错误的原因与解决方法
- 超详细解读Java接口:模块通信协议以及默认方法和静态方法
- 解决Java程序连接MySQL数据库的方法(java链接mysql数据库)
- 解决Linux下重启Java程序的方法(linux重启java)
- 时间解决Java操纵Redis设置过期时间的方法(redisjava过期)
- 程序Oracle调用Java程序的实现方法(oracle调用java)
- Java驾驭MySQL,读写如飞(java读写mysql)
- 使用Java连接MySQL数据库的具体操作方法(java连接mysql代码)
- Oracle中实现Java程序设计的极限可能性(oracle中的java)
- Redis中使用Java快速实现自增(redis自增 java)
- Java方法的覆盖与隐藏的区别分析
- java打印当前方法名示例分享
- java读取文件字符集示例方法