• 前言:

    虽然java的API中说创建多线程的方式只有两种(There are two ways to create a new thread of execution),分别是继承Thread类创建和实现Runnable接口创建,在上一篇博文中演示了这两种,详见,但是JDK5.0以后新增了两种,分别是实现Callable接口创建和使用线程池创建,本次就演示后两种创建方式并分析其特性。


  • 实现Runnable接口创建多线程

    创建步骤:

    1.创建一个实现Callable接口的类。

    2.重写call()方法,线程需要执行的代码都放到call方法中。

    3.创建实现Callable接口类的实例对象。

    4.将步骤 3 的对象作为参数传给FutureTask构造器中,创建FutureTask对象。

    5.将FutureTask的对象作为参数传给Thread类,创建对象并调用start()方法。

  1. package day02;
  2. import java.util.concurrent.Callable;
  3. import java.util.concurrent.ExecutionException;
  4. import java.util.concurrent.FutureTask;
  5. //创建一个多线程,输出20以内的偶数,并返回所有偶数的和
  6. //1.创建一个实现`Callable`接口的类。
  7. class TestSum implements Callable{
  8. //2.重写call()方法,线程需要执行的代码都放到call方法中。
  9. @Override
  10. public Object call() throws Exception{
  11. int sum = 0;
  12. for(int i = 1;i <= 20 ;i++ ){
  13. if(i % 2 == 0){
  14. System.out.println(i);
  15. sum = sum + i;
  16. }
  17. }
  18. return sum;
  19. }
  20. }
  21. public class ThreadCall {
  22. public static void main(String[] args) throws ExecutionException, InterruptedException {
  23. //3.创建实现`Callable`接口类的实例对象。
  24. TestSum test = new TestSum();
  25. //4.将步骤 3 的对象作为参数传给`FutureTask`构造器中,创建`FutureTask`对象。
  26. FutureTask futuretask = new FutureTask(test);
  27. //5.将`FutureTask`的对象作为参数传给`Thread`类,创建对象并调用start()方法。
  28. Thread thread = new Thread(futuretask);
  29. thread.start();
  30. //get方法可以获取返回值
  31. System.out.println("偶数总合是:"+futuretask.get());
  32. }
  33. }
  34. //输出结果:
  35. 2
  36. 4
  37. 6
  38. 8
  39. 10
  40. 12
  41. 14
  42. 16
  43. 18
  44. 20
  45. 偶数总合是:110

实现Callable接口创建多线程的特点:

​ 1.call()方法可以有返回值,可以使用get()方法获取返回值。

​ 2.call()方法可以抛出异常, 而且能被外面捕获到。

​ 3.Callable支持泛型。


  • 使用线程池创建多线程

    一.实现Runnable接口的方式创建:

  1. package day02;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. class Number implements Runnable{
  5. @Override
  6. public void run() {
  7. for (int i = 0; i < 20; i++) {
  8. if (i % 2 == 0){
  9. System.out.println(Thread.currentThread().getName()+":"+i);
  10. }
  11. }
  12. }
  13. }
  14. public class ThreadPool {
  15. public static void main(String[] args){
  16. ExecutorService service = Executors.newFixedThreadPool(10);
  17. Number num = new Number();
  18. service.execute(num);
  19. service.shutdown();

二.实现Callable接口的方式创建:

  1. package day02;
  2. import java.util.concurrent.Callable;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. class Number implements Callable {
  6. @Override
  7. public Object call() {
  8. for (int i = 0; i < 20; i++) {
  9. if (i % 2 == 0){
  10. System.out.println(Thread.currentThread().getName()+":"+i);
  11. }
  12. }
  13. return null;
  14. }
  15. }
  16. public class ThreadPool {
  17. public static void main(String[] args){
  18. ExecutorService service = Executors.newFixedThreadPool(10);
  19. Number num = new Number();
  20. service.submit(num);//区别在这里
  21. service.shutdown();
  22. }
  23. }
  • 线程池好处:

    1.频繁创建线程和销毁使用量较大的资源,比如并发的线程,对性能影响较大,所以需要创建线 程池存放线程,使用的时候直接获取,实现重复利用,提高效率。

    2.降低创建线程时间,提高响应速度。

    3.降低资源的消耗。

    4.便于线程管理。

Java多线程的创建(二)的更多相关文章

  1. Java多线程(1) 创建

    一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下以下这张较为经典的图: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Threa ...

  2. Java多线程学习(二)synchronized关键字(2)

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  3. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  4. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. Java多线程总结(二)锁、线程池

    掌握Java中的多线程,必须掌握Java中的各种锁,以及了解Java中线程池的运用.关于Java多线程基础总结可以参考我的这篇博文Java多线程总结(一)多线程基础 转载请注明出处——http://w ...

  7. [转载] java多线程总结(二)

    转载自:http://www.cnblogs.com/lwbqqyumidi/p/3817517.html 作者:Windstep 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几 ...

  8. Java多线程编程核心技术(二)对象及变量的并发访问

    本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...

  9. JAVA多线程基础学习二:synchronized

    本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题,没错就是使用synchronized. 一.如何解决线程安全问题? 一般 ...

随机推荐

  1. CSS3 box-sizing 盒子布局

    在CSS中盒模型被分为两种,第一种是W3C的标准模型,第二种是IE怪异盒模型.不同之处在于后者的宽高定义的是可见元素框的尺寸,而不是元素框的内容区尺寸.目前对于浏览器大多数元素都是基于W3C标准的盒模 ...

  2. 2019-10-18-WPF-高速书写-StylusPlugIn-原理

    title author date CreateTime categories WPF 高速书写 StylusPlugIn 原理 lindexi 2019-10-18 21:23:46 +0800 2 ...

  3. H3C IP地址与子网掩码

  4. gu集合

    离散型随机变量的一切可能的取值  与对应的概率  乘积之和称为该离散型随机变量的数学期望,本题期望是概率乘得分之和 数列是递增的,可以枚举第二小的数,假设选第i个数为第2小的数,则第1小的数有i-1种 ...

  5. java.util.Date和jdk1.8新时间API比拼

    旧的时间和日期的API的缺陷 Java 的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,而且都不是线程安全的. Date如果不格式化,打印出的日期可 ...

  6. Activiti工作流引擎学习(一)

    1.部署对象和流程定义相关表:RepositoryService act_re_deployment: 部署对象表:一次部署的多个文件的信息,对于不需要的流程可以删除和修改 act_re_procde ...

  7. Linux 内核子系统

    一个子系统是作为一个整体对内核一个高级部分的代表. 子系统常常(但是不是一直)出现 在 sysfs 层次的顶级. 一些内核中的例子子系统包括 block_subsys(/sys/block, 给块 设 ...

  8. You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

    异常 You are using the runtime-only build of Vue where the template compiler is not available. Either ...

  9. lnmp一键安装,安装php时失败

    查看安装日志 直接cd进入根目录报错内容:configure: error: mcrypt.h not found. Please reinstall libmcrypt 解决办法如下#使用wget可 ...

  10. 25.python之面向对象

    一 三大编程范式 正本清源一:有人说,函数式编程就是用函数编程--->傻逼 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的python语法后,大家就可以写python代码了,然后每个 ...