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. decimal类型保留两位小数

    oj.PriceTop =Math.Round(Convert.ToDecimal(reader["PriceTop"]),2);

  2. Lintcode: Previous Permuation

    Given a list of integers, which denote a permutation. Find the previous permutation in ascending ord ...

  3. Applescript 带参数调用某个App的方法

    do shell script "open '/Users/eran/Documents/Workground/DragonAdventure/FlashCode/tools/SWFInfo ...

  4. java类的定义以及参数传递

    class类(类似结构体)的定义 import java.util.Scanner; import java.io.*; class student{//类的名称 public String name ...

  5. 压缩 & 解压缩 命令汇总:tar、zip & unzip、

    1. tar命令详解     格式:tar [-cxtzjvfpPN] 文件与目录 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五 ...

  6. vmware ubuntu server 联网

    查看本地ip 直接输入命令 ifConfig 只有 lo ,而没有eth0和eth1: 输入命令ifconfig -a,lo.eth0皆存在: 但是eth0 完全没有ip地址等,可以通过修改 /etc ...

  7. Node.js Express 获取request原始数据

    app.use(bodyParser.json());客户端请求接口时如果指名请求头类型 为Content-Type=application/jsonbodyParser 会自动将 body 里的 j ...

  8. html随笔

    <!DOCTYPE HTML> <html> <head> <meta charset = "utf-8"> <script ...

  9. paper 21 :Libsvm的安装和使用

    看了很多资料(包括我们实验室群里师兄上传的资料),算是掌握了libsvm的正确安装和使用,把结果告诉大家以方便以后使用. 1. 参考网站: libsvm库下载:http://www.csie.ntu. ...

  10. 夺命雷公狗---Thinkphp----5之数据库的链接

    我们打开WEB目录下发现了Common和Home以及Runtime这三个文件夹 那么我们第一个目标是完成网站后台的首页吧,那么我们就直接将Home的文件夹复制一份出来,并且改名为Admin这样就可以分 ...