当前位置: 首页 > news >正文

网站 建设阶段网站建设文化效果

网站 建设阶段,网站建设文化效果,宁波品牌网站设计特点,网络搏彩网站做代理一、Callable 与 Runnable 先说一下java.lang.Runnable吧#xff0c;它是一个接口#xff0c;在它里面只声明了一个run()方法#xff1a; public interface Runnable {public abstract void run(); }由于run()方法返回值为void类型#xff0c;所以在执行完任务之后无法返…一、Callable 与 Runnable 先说一下java.lang.Runnable吧它是一个接口在它里面只声明了一个run()方法 public interface Runnable {public abstract void run(); }由于run()方法返回值为void类型所以在执行完任务之后无法返回任何结果。 Callable位于java.util.concurrent包下它也是一个接口在它里面也只声明了一个方法只不过这个方法叫做call() public interface CallableV {/*** Computes a result, or throws an exception if unable to do so.** return computed result* throws Exception if unable to compute a result*/V call() throws Exception; }可以看到这是一个泛型接口该接口声明了一个名称为call()的方法同时这个方法可以有返回值V也可以抛出异常。call()方法返回的类型就是传递进来的V类型。 那么怎么使用Callable呢一般情况下是配合ExecutorService来使用的在ExecutorService接口中声明了若干个submit方法的重载版本 T FutureT submit(CallableT task); T FutureT submit(Runnable task, T result); Future? submit(Runnable task);第一个方法submit提交一个实现Callable接口的任务并且返回封装了异步计算结果的Future。 第二个方法submit提交一个实现Runnable接口的任务并且指定了在调用Future的get方法时返回的result对象。 第三个方法submit提交一个实现Runnable接口的任务并且返回封装了异步计算结果的Future。 因此我们只要创建好我们的线程对象实现Callable接口或者Runnable接口然后通过上面3个方法提交给线程池去执行即可。 二、Future Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果该方法会阻塞直到任务返回结果。 Future接口是用来获取异步计算结果的说白了就是对具体的Runnable或者Callable对象任务执行的结果进行获取(get())取消(cancel())判断是否完成等操作。我们看看Future接口的源码 public interface FutureV {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException; }在Future接口中声明了5个方法下面依次解释每个方法的作用 cancel方法用来取消任务如果取消任务成功则返回true如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务如果设置true则表示可以取消正在执行过程中的任务。如果任务已经完成则无论mayInterruptIfRunning为true还是false此方法肯定返回false即如果取消已经完成的任务会返回false如果任务正在执行若mayInterruptIfRunning设置为true则返回true若mayInterruptIfRunning设置为false则返回false如果任务还没有执行则无论mayInterruptIfRunning为true还是false肯定返回true。 isCancelled方法表示任务是否被取消成功如果在任务正常完成前被取消成功则返回 true。 isDone方法表示任务是否已经完成若任务完成则返回true get()方法用来获取执行结果这个方法会产生阻塞会一直等到任务执行完毕才返回 get(long timeout, TimeUnit unit)用来获取执行结果如果在指定时间内还没获取到结果就直接返回null。 也就是说Future提供了三种功能 1判断任务是否完成 2能够中断任务 3能够获取任务执行结果。 因为Future只是一个接口所以是无法直接用来创建对象使用的因此就有了下面的FutureTask。 三、FutureTask 我们先来看一下FutureTask的实现 public class FutureTaskV implements RunnableFutureVFutureTask类实现了RunnableFuture接口我们看一下RunnableFuture接口的实现public interface RunnableFutureV extends Runnable, FutureV {void run(); }可以看出RunnableFuture继承了Runnable接口和Future接口而FutureTask实现了RunnableFuture接口。所以它既可以作为Runnable被线程执行又可以作为Future得到Callable的返回值。 分析 FutureTask除了实现了Future接口外还实现了Runnable接口因此FutureTask也可以直接提交给Executor执行。 当然也可以调用线程直接执行FutureTask.run()。接下来我们根据FutureTask.run()的执行时机来分析其所处的3种状态 1未启动FutureTask.run()方法还没有被执行之前FutureTask处于未启动状态当创建一个FutureTask而且没有执行FutureTask.run()方法前这个FutureTask也处于未启动状态。 2已启动FutureTask.run()被执行的过程中FutureTask处于已启动状态。 3已完成FutureTask.run()方法执行完正常结束或者被取消或者抛出异常而结束FutureTask都处于完成状态。 下面我们再来看看FutureTask的方法执行示意图方法和Future接口基本是一样的这里就不过多描述了 分析 1当FutureTask处于未启动或已启动状态时如果此时我们执行FutureTask.get()方法将导致调用线程阻塞当FutureTask处于已完成状态时执行FutureTask.get()方法将导致调用线程立即返回结果或者抛出异常。 2当FutureTask处于未启动状态时执行FutureTask.cancel()方法将导致此任务永远不会执行。当FutureTask处于已启动状态时执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务如果任务取消成功cancel(…)返回true但如果执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成)此时cancel(…)返回false。当任务已经完成执行cancel(…)方法将返回false。 最后我们给出FutureTask的两种构造函数 public FutureTask(CallableV callable) { } public FutureTask(Runnable runnable, V result) { }事实上FutureTask是Future接口的一个唯一实现类。 四、使用示例 通过上面的介绍我们对CallableFutureFutureTask都有了比较清晰的了解了那么它们到底有什么用呢我们前面说过通过这样的方式去创建线程的话最大的好处就是能够返回结果加入有这样的场景我们现在需要计算一个数据而这个数据的计算比较耗时而我们后面的程序也要用到这个数据结果那么这个时候Callable岂不是最好的选择我们可以开设一个线程去执行计算而主线程继续做其他事而后面需要使用到这个数据时我们再使用Future获取不就可以了吗下面我们就来编写一个这样的实例。 1、使用CallableFuture获取执行结果 package com.demo.test;import java.util.concurrent.Callable;public class Task implements CallableInteger{Overridepublic Integer call() throws Exception {System.out.println(子线程在进行计算);Thread.sleep(3000);int sum 0;for(int i0;i100;i)sum i;return sum;}}package com.demo.test;import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;public class CallableTest {public static void main(String[] args) {//创建线程池ExecutorService executor Executors.newCachedThreadPool();//创建Callable对象任务 Task task new Task();//提交任务并获取执行结果 FutureInteger result executor.submit(task);//关闭线程池 executor.shutdown();try {Thread.sleep(1000);} catch (InterruptedException e1) {e1.printStackTrace();}System.out.println(主线程在执行任务);try {if(result.get()!null){ System.out.println(task运行结果result.get());}else{System.out.println(未获取到结果); }} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.println(所有任务执行完毕);} }运行结果子线程在进行计算 主线程在执行任务 task运行结果4950 所有任务执行完毕1、使用CallableFutureTask获取执行结果 package com.demo.test;import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask;public class CallableTest1 {public static void main(String[] args) {//第一种方式ExecutorService executor Executors.newCachedThreadPool();Task task new Task();FutureTaskInteger futureTask new FutureTaskInteger(task);executor.submit(futureTask);executor.shutdown();//第二种方式注意这种方式和第一种方式效果是类似的只不过一个使用的是ExecutorService一个使用的是Thread // Task task new Task(); // FutureTaskInteger futureTask new FutureTaskInteger(task); // Thread thread new Thread(futureTask); // thread.start();try {Thread.sleep(1000);} catch (InterruptedException e1) {e1.printStackTrace();}System.out.println(主线程在执行任务);try {if(futureTask.get()!null){ System.out.println(task运行结果futureTask.get());}else{System.out.println(future.get()未获取到结果); }} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.println(所有任务执行完毕);} }运行结果同上。 补充 实现Runnable接口和实现Callable接口的区别 1、Runnable是自从java1.1就有了而Callable是1.5之后才加上去的。 2、Callable规定的方法是call(),Runnable规定的方法是run()。 3、Callable的任务执行后可返回值而Runnable的任务是不能返回值(是void)。 4、call方法可以抛出异常run方法不可以。 5、运行Callable任务可以拿到一个Future对象表示异步计算的结果。它提供了检查计算是否完成的方法以等待计算的完成并检索计算的结果。通过Future对象可以了解任务执行情况可取消任务的执行还可获取执行结果。 6、加入线程池运行Runnable使用ExecutorService的execute方法Callable使用submit方法。
http://www.hkea.cn/news/14448644/

相关文章:

  • 怎么设置iis默认网站在农村做相亲网站怎么样
  • 免费建立网站的平台规范门户网站的建设和管理办法
  • 潍坊网站建设熊掌号互联网+营销策略怎么写
  • 上海知名网站开发公司怎么做网页链接教程
  • 西安做网站印象网络湖北住房与城乡建设厅网站
  • 策划设计网站中国空间站科幻作文1000字
  • 网站规划与建设重要性理解与体会forum wordpress
  • 三网合一网站远吗wordpress alchem
  • 做八闽最好的中学网站秦皇岛平台公司
  • 自适应网站主要用什么做网站sem优化怎么做
  • 昌网站建设网站建设厦门
  • 网站做服装那个平台好一点中国电力建设集团公司官方网站
  • 房产信息网网站linux系统打开wordpress
  • 深圳 网站建设 公司网站建设在线推广
  • 济南大型网站制作91wan网页游戏平台
  • 自己做购物网站怎么做基于cms的企业网站建设
  • 自己做服务器网站wordpress自动采集图片
  • 网站开发发展现状php网站怎么搭建环境配置
  • 网站的数据库选择电子商务网站栏目
  • 阿里云认证网站建设题库公司年会活动方案策划
  • 在线学做网站如何创作个人网站
  • 建设网站的五个步骤网站开发支持环境
  • 网站优化具体怎么做四川建筑职业技术学院就业网
  • 台州市住房和城乡建设规划局网站制作网页时一般使用什么对网页进行布局
  • 新广告法 做网站的搭建网络环境
  • 刷单网站开发河源东源新闻最新消息
  • wordpress忘记密码seo公司网站推广
  • 长沙亿仁网络科技有限公司做seo推广公司网站
  • 湖北省建设工程网站一站式免费建站平台
  • 重庆网站备案流程手机端网页怎么开发