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

做博客网站最好用什么系统做网站的工作量

做博客网站最好用什么系统,做网站的工作量,做淘宝网站用什么浏览器,中国建设银行企业官网站Thread、Runnable、Callable、Future、FutureTask#xff0c;你能详细讲出他们的内部关系么#xff1f;这也是面试经常问到的问题。 1. Thread 和 Runnable 1.1 Thread 我们先看一下 Thread 最简单的使用姿势#xff1a; public class MyThread extends Thread {public M…Thread、Runnable、Callable、Future、FutureTask你能详细讲出他们的内部关系么这也是面试经常问到的问题。 1. Thread 和 Runnable 1.1 Thread 我们先看一下 Thread 最简单的使用姿势 public class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {String name  Thread.currentThread().getName();System.out.println(name  已经运行);}public static void main(String[] args) {new MyThread(线程一).start();} }线程包含 4 个状态创建 - 就绪 - 运行 - 结束。 当执行 start() 后线程进入就绪状态当对应的线程抢占到 cpu 调度资源之后进入运行状态此时调用的是 run 方法执行完毕之后就结束了。 1.2 Runnable 我们看一下 Runnable 最简单的使用姿势 public class MyTask implements Runnable {Overridepublic void run() {String name  Thread.currentThread().getName();System.out.println(name  已经运行);}public static void main(String[] args) {new Thread(new MyTask(),线程二).start();} }这里 MyTask 就是一个 Runnable实现了 run() 方法作为 Thread() 的入参。 基本所有同学都知道这样使用但是你们知道原理么 1.3 Thread 和 Runnable 的关系 我们看一下 Runnable 的接口定义 public interface Runnable {/*** When an object implementing interface codeRunnable/code is used* to create a thread, starting the thread causes the objects* coderun/code method to be called in that separately executing* thread.* p* The general contract of the method coderun/code is that it may* take any action whatsoever.** see     java.lang.Thread#run()*/public abstract void run(); }英文翻译大致如下当一个对象继承并实现了 run() 方法当线程 start() 后会在该线程中单独执行该对象的 run() 方法。 这段翻译基本就告诉了 Runnable 和 Thread 的关系 MyTask 继承 Runnable并实现了 run() 方法 Thread 初始化将 MyTask 作为自己的成员变量 Thread 执行 run() 方法线程处于“就绪”状态 等待 CPU 调度执行 Thread 的 run() 方法但是 run() 的内部实现其实是执行的 MyTask.run() 方法线程处于“运行”状态。 这里面的第2、4步需要对照着源码看看。 在 Thread 初始化时MyTask 作为入参 target最后赋值给 Thread.target 当执行 Thread.run() 时其实是执行的 target.run()即 MyTask.run()这个是典型的策略模式 2. Callable 、Future 和 FutureTask 先看一下它们的整体关系图谱 我刚开始看到这幅图感觉 Java 真是麻烦已经有了 Thread 和 Runnable 这两种创建线程的方式为啥又搞这 3 个东西呢 其实对于 Thread 和 Runable其 run() 都是无返回值的并且无法抛出异常所以当你需要返回多线程的数据就需要借助 Callable 和 Future。 2.1 Callable Callable 是一个接口里面有个 V call() 方法这个 V 就是我们的返回值类型 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; }我们一般会用匿名类的方式使用 Callablecall() 中是具体的业务逻辑 CallableString callable  new CallableString() {Overridepublic String call() throws Exception {// 执行业务逻辑 ...return this is Callable is running;} };这里抛出一个问题这个 callable.call() 和 Thread.run() 是什么关系呢 2.2 FutureTask 通过关系图谱FutureTask 继承了 RunnableFutureRunnableFuture 继承了 Runnable 和 Future public interface RunnableFutureV extends Runnable, FutureV {/*** Sets this Future to the result of its computation* unless it has been cancelled.*/void run(); }所以FutureTask 也是个 Runnable 这里就有点意思了既然 FutureTask 是个 Runnable肯定就需要实现 FutureTask.run() 方法那么 FutureTask 也可以作为 Thread 的初始化入参使用姿势如下 new Thread(FutureTask对象).start();所以当执行 Thread.run() 时其实是执行的 FutureTask.run()这个是我们破解的第一层。 下面我们再破解 FutureTask.run() 和 Callable.call() 的关系。 2.3 Callable 和 FutureTask 的关系 FutureTask 初始化时Callable 必须作为 FutureTask 的初始化入参 当执行 FutureTask.run() 时其实执行的是 Callable.call() 所以这里又是一个典型的策略模式 现在我们应该可以很清楚知道 Thread 、Runnable、FutureTask 和 Callable 的关系 Thread.run() 执行的是 Runnable.run() FutureTask 继承了 Runnable并实现了 FutureTask.run() FutureTask.run() 执行的是 Callable.run() 依次传递最后 Thread.run()其实是执行的 Callable.run()。 所以整个设计方法其实就是 2 个策略模式Thread 和 Runnable 是一个策略模式FutureTask 和 Callable 又是一个策略模式最后通过 Runnable 和 FutureTask 的继承关系将这 2 个策略模式组合在一起。 嗯嗯。。。我们是不是把 Future 给忘了~~ 2.4 Future 为什么要有 Future 呢我再问一个问题大家可能就知道了。 我们通过 FutureTask借助 Thread 执行线程后结果数据我们怎么获取到呢这里就需要借助到 Future。 我们看一下 Future 接口 public interface FutureV {// 取消任务如果任务正在运行的mayInterruptIfRunning为true时表明这个任务会被打断的并返回true// 为false时会等待这个任务执行完返回true若任务还没执行取消任务后返回true如任务执行完返回falseboolean cancel(boolean mayInterruptIfRunning);// 判断任务是否被取消了,正常执行完不算被取消boolean isCancelled();// 判断任务是否已经执行完成任务取消或发生异常也算是完成返回trueboolean isDone();// 获取任务返回结果如果任务没有执行完成则等待完成将结果返回如果获取的过程中发生异常就抛出异常// 比如中断就会抛出InterruptedException异常等异常V get() throws InterruptedException, ExecutionException;// 在规定的时间如果没有返回结果就会抛出TimeoutException异常V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }对于 FutureTaskCallable 就是他的任务而 FutureTask 内部维护了一个任务状态所有的状态都是围绕这个任务来进行的随着任务的进行状态也在不断的更新。 FutureTask 继承了 Future实现对任务的取消、数据获取、任务状态判断等功能。 比如我们经常会调用 get() 方法获取数据如果任务没有执行完成会将当前线程放入阻塞队列等待当任务执行完后会唤醒阻塞队列中的线程。 3. 具体实例 private static ListString processByMultiThread(Integer batchSize) throws ExecutionException, InterruptedException {ListString output  new ArrayList();// 获取分批数据ListListInteger batchProcessData  getProcessData(batchSize);// 启动线程ListFutureTaskListString futureTaskList  new ArrayList();for (ListInteger processData : batchProcessData) {CallableListString callable  () - processOneThread(processData);FutureTaskListString futureTask  new FutureTask(callable);new Thread(futureTask).start();  // 启动线程futureTaskList.add(futureTask);}// 获取线程返回的数据for (FutureTask futureTask : futureTaskList) {ListString processData  (ListString) futureTask.get();output.addAll(processData);}return output; }这个示例很简单 先将数据按照 batchSize 分成 N 批 启动 N 个线程去执行任务 通过 futureTask.get() 获取每个线程数据并汇总输出。 这个示例其实不太适合线上的场景因为每次调用都会初始化线程如果调用过多内存可能会被撑爆需要借助线程池。 https://github.com/lml200701158/java-study/blob/master/src/main/java/com/java/parallel/share/MultiThreadProcess.javahttps://github.com/lml200701158/java-study/blob/master/src/main/java/com/java/parallel/share/MultiThreadProcess.java ··················END················
http://www.yutouwan.com/news/433487/

相关文章:

  • 网站平台建设实训总结郑州专业网站制作服务费用
  • 免费建网站无广告婚恋网站上认识人 带你做原油交易
  • 义乌做网站哪家好wordpress中国区官方论坛
  • 网站网页翻页设计微信网站主题
  • 网站开发可以学吗怎样建设VR网站
  • wordpress搭建多个购物网站国外网站建设现状
  • 怎么将网站做成小程序石家庄新华区网站建设
  • 公司 网站建设 会计科目个人网页制作模板三张
  • 连锁销售网站制作支付网站建设要求
  • 网站建设与管理清考作业南京制作网页学校
  • 租房网站建设多少钱软件商店下载官网
  • diango做的网站怎么用房地产开发公司网站建设方案模板
  • 常见的网站名称有哪些个人网站的搭建
  • 深圳注明企业网站设计深圳市公司网站建设公司
  • 网站开发 简单重庆哪家网站
  • 做网站没有公网做购彩网站是怎么盈利的
  • 购物网站html模板免费制作网页
  • 品牌网站建设流程一个网站两个域名
  • 网站开发培训机构哪个好北京电商公司有哪些
  • 中国建设银行网站网上业务服务范围天华建筑设计公司官网
  • 网站信息化建设总结用家用电脑建设网站
  • 外贸网站建设哪家实惠鞍山便民信息平台
  • 汽车网站建设可行性分析开发外包公司
  • 浙江建设集团网站首页网络推广方案文案
  • 广西智能网站建设方案珠海网站建设的公司哪家好
  • 网站推广优化流程关于网站建设的网站有哪些
  • 有专门学做衣服网站有哪些张家港网站建设培训班
  • 政务网站建设的功能模块长安营销型网站建设
  • 中文一级a做爰片免费网站网站内容优化方法有哪些内容
  • 网站名称搜索不到301不同类型网站