java多线程的三种实现方式

一.继承Thread类

二.实现Runnable接口

三.使用ExecutorService, Callable, Future

无论是通过继承Thread类还是实现Runnable接口来实现java多线程, 都得不到线程执行后的结果. 要想得到线程执行后的结果,就需要使用ExecutorService, Callable, Future来实现java多线程.

可返回值的任务必须实现Callable接口, 类似的, 无返回值的任务必须实现Runnable接口. 执行Callable任务后, 可以获取一个Future对象, 在该对象上调用get方法就可以获取到Callable任务返回的结果了, 再结合线程池接口ExecutorService就可以实现有返回结果的多线程了. 下面给出一个完整的例子.

 public class Test {
     public static void main(String[] args) {
         ExecutorService executor = Executors.newCachedThreadPool();
         Task task = new Task();
         Future<Integer> result = executor.submit(task);
         executor.shutdown();

         try {
             Thread.sleep(1000);
         } catch (InterruptedException e1) {
             e1.printStackTrace();
         }

         System.out.println("主线程在执行任务");

         try {
             System.out.println("task运行结果"+result.get());
         } catch (InterruptedException e) {
             e.printStackTrace();
         } catch (ExecutionException e) {
             e.printStackTrace();
         }

         System.out.println("所有任务执行完毕");
     }
 }
 class Task implements Callable<Integer>{
     @Override
     public Integer call() throws Exception {
         System.out.println("子线程在进行计算");
         Thread.sleep(3000);
         int sum = 0;
         for(int i=0;i<100;i++)
             sum += i;
         return sum;
     }
 }

执行结果

 子线程在进行计算
 主线程在执行任务
 task运行结果4950
 所有任务执行完毕

上述代码中, Executors类提供了一系列工厂方法用于创建线程池, 返回的线程池都实现了ExecutorService接口.

/**
 *创建固定数目线程的线程池
*/
public static ExecutorService newFixedThreadPool(int nThreads) 

/**  *创建可缓存的线程池, 调用execute()将重用以前构造的线程(如果线程可用). *如果现有线程没有可用的, 则创建一个新线程并添加到线程池中. *终止并从缓存中移除那些已有60秒未被使用的线程*/public static ExecutorService newCachedThreadPool() 
/**
 *创建一个单线程化的Executor
*/public static ExecutorService newSingleThreadExecutor() 

/**  *创建一个支持定时和周期性的任务执行的线程池*/public static ScheduledExecutorService newScheduledThreadPool() 

ExecutorService提供了submit()方法, 传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这时调用Future对象的get()方法时,会阻塞直到计算完成.

Java多线程的三种实现方式的更多相关文章

  1. java 多线程编程三种实现方式

    一种是继承Thread类,一种是实现Runable接口,还有一种是实现callable接口: 有博主说只有前面2种方式,我个人愚见是三种,主要详细介绍下callable的使用: 三种线程的我的个人理解 ...

  2. java多线程的几种实现方式

    java多线程的几种实现方式 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通 ...

  3. 阿里巴巴--java多线程的两种实现方式,以及二者的区别

    阿里巴巴面试的时候,昨天问了我java面试的时候实现java多线程的两种方式,以及二者的区别当时只回答了实现线程的两种方式,但是没有回答上二者的区别: java实现多线程有两种方式: 1.继承Thre ...

  4. java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较

    一.list简介 List列表类,顺序存储任何对象(顺序不变),可重复. List是继承于Collection的接口,不能实例化.实例化可以用: ArrayList(实现动态数组),查询快(随意访问或 ...

  5. Java定时器的三种实现方式

    一.普通thread /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现, ...

  6. Java多线程的两种实现方式

    Java总共有两种方式实现多线程 方式1:通过继承Thread类的方式 package com.day04; /** * 通过继承Thread类并复写run方法来是实现多线程 * * @author ...

  7. Java数组的三种打印方式

    1.数组的输出的三种方式 一维数组: 定义一个数组 int[] array = {1,2,3,4,5}; (1)传统的for循环方式 for(int i=0;i<array.length;i++ ...

  8. Java多线程【三种实现方法】

    java多线程 并发与并行 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行 并行:一组程 ...

  9. java多线程的几种实现方式记录

    传统的实现线程的方式为三种,分别为继承Thread类,重写run()方法:实现Runable接口,重写run()方法:实现callable接口,重写call()方法:下面来记录一下最基本的三种编码实现 ...

随机推荐

  1. zip格式jdk在Linux环境下的安装过程

    1下载jdk [root@localhost opt]# cd soft_bak/[root@localhost soft_bak]# lsjdk1.7.0_25.zip postgresql-9.4 ...

  2. 通达信:显示K线图日期

    INFO_A:=STRCAT('INFO_A=', STRCAT(CON2STR(REF(MONTH, REF_BAR_A), 0), STRCAT('-', STRCAT(CON2STR(REF(D ...

  3. Linux 系统结构

    Linux的系统结构一般由四部分组成 内核 1)内核 操作系统的核心,具有最基本的功能:内存管理.进程管理.设备驱动管理.文件系统管理,网络管理 内核版本(kernel)查看的三种方法 cat /pr ...

  4. extjs grid 单元格 多选

    new Ext.grid.CellSelectionModel({ last : false, // 上一次选中的单元格 selections : [], // 选择区缓存 handleMouseDo ...

  5. 当执行php脚本时用户关闭浏览器会发生什么?

    2008年8月16日 1,152 views 发表评论 阅读评论 如果一段php脚本执行插入数据到mysql的操作. 一般情况下,由于php脚本在服务器上执行,此时用户虽然关闭了浏览器,但是服务器端的 ...

  6. IIS7.5解决应用程序池回收假死问题

    使用windows server 2008 r2解决回收假死的问题. 具体做法是: 打开应用程序池 -> 高级设置 ->在“禁止重叠回收”里选择“true”,这样就有效避免了应用程序池回收 ...

  7. paper 85:机器统计学习方法——CART, Bagging, Random Forest, Boosting

    本文从统计学角度讲解了CART(Classification And Regression Tree), Bagging(bootstrap aggregation), Random Forest B ...

  8. 记在centos中连接无线网络的一次过程

    1. 首先, 你的系统要能驱动无限网卡, 要是人品好的话, 系统已经自带了你的网卡的驱动程序. 不然就要先搞定无线网卡的驱动再说. 不然后面的步骤也就没必要了. 2. 看一下你的无线网卡叫什么: iw ...

  9. Yii2.0 查询(CRUD)

    yii2使用中的一些基本的增删改查操作.以用户为例说明: User::find()->all();    //返回所有用户数据:   User::findOne($id);   //返回 主键 ...

  10. android 学习随笔十五(Activity的生命周期与摧毁时返回数据 )

    1.Activity的生命周期 onCreate:创建时调用 onStart:在屏幕上可见,但是还没有获得焦点 onResume:可见并且获得焦点 onPause:可见,但是失去焦点 onStop:不 ...