• 前言:

    虽然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()方法。

package day02;

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

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

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

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

​ 3.Callable支持泛型。


  • 使用线程池创建多线程

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

package day02;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; class Number implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if (i % 2 == 0){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
} public class ThreadPool {
public static void main(String[] args){
ExecutorService service = Executors.newFixedThreadPool(10);
Number num = new Number();
service.execute(num);
service.shutdown();

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

package day02;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; class Number implements Callable {
@Override
public Object call() {
for (int i = 0; i < 20; i++) {
if (i % 2 == 0){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
return null;
}
} public class ThreadPool {
public static void main(String[] args){
ExecutorService service = Executors.newFixedThreadPool(10);
Number num = new Number();
service.submit(num);//区别在这里
service.shutdown();
}
}
  • 线程池好处:

    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. [学习笔记]k短路

    A*:我已经忘了怎么写了,反正n=30,m=1000都能卡掉... 正解:可持久化左偏树+堆维护可能集合 原论文:http://www.docin.com/p-1387370338.html 概括: ...

  2. 关于Character的digit,forDigit,getNumericValue方法的一点理解

    Character类是一个包装类. char这种数据类型是基于原始的Unicode编码的,储存一个char用16个bit,因此定义characters也是16位定长的实体集合. Unicode编码标准 ...

  3. H3C 端口隔离配置举例

  4. JUnit 单元测试断言推荐 AssertJ

    文章转自:http://sgq0085.iteye.com/blog/2030609 前言 由于JUnit的Assert是公认的烂API,所以不推荐使用,目前推荐使用的是AssertJ. Assert ...

  5. SPOJ - DISUBSTR Distinct Substrings (后缀数组)

    Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...

  6. 使用condition 实现线程顺序执行

    书上给的例子都是ABCABC这种,比较简单,复杂点的如A0B0C0, A0A1A2没有,手动实现下,做个记录 1. A0 A1 A2 A3 public class Demo0 { private s ...

  7. CSS一行显示,显示不下的用省略号显示

    CSS一行显示,显示不下的用省略号显示 .abc{ white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } 复制上面代码即可 ...

  8. mysql中information_schema.triggers字段说明

    1. 获取所有触发器信息(TRIGGERS) SELECT  *  FROM information_schema.TRIGGERS WHERE  TRIGGER_SCHEMA='数据库名';  TR ...

  9. Python综合应用:教你用字符打印一张怀旧风格的照片

    1. 前言第一次在学校机房里见到计算机,还是上古时期.计算机型号大概是LASER-310吧,有点记不清了.那会儿,显示器还是单色的,只能显示文本,每行最多显示80个字符.想看图片,印象中只能用针式打印 ...

  10. rapidxml遍历子节点例子

    <?xml version="1.0" encoding="utf-8"?> <luaword> <btn> <inf ...