在jdk5.0后又新增了两种解决线程安全的问题

一: 实现Callable接口,

实现接口步骤:

1: 创建一个实现Callable接口的实现类
2: 实现Callable接口中的call()方法, 讲此线程需要做的操作声明再这个方法中
3: 创建Callable 接口实现类的对象
4: 将创建对象传递到FutureTask构造器中,创建FutureTask对象
5: 将Future的对象作为参数传递到Thread类中 并调用thread的start()方法
6: 通过get()获取call方法中的返回值
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; public class CallableTestTwo {
public static void main(String[] args) {
CallableT callableT = new CallableT(); // 3 : 实例化 实现Callable接口的类的对象
FutureTask futureTask = new FutureTask(callableT); // 4: 传递此对象到FutureTask 中 并实例化
new Thread(futureTask).start(); // 5: 生产对象传递到Thread 中并调用start()方法来启动线程 try { // 6: get获取call方法中抛出的信息 get方法必须搭配try来使用
Object val = futureTask.get();
System.out.println("总和是: "+val);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
} class CallableT implements Callable { // 1: 实现Calable接口
@Override
public Object call() throws Exception { // 2 :实现接口Callable接口中的call()方法
int num = 0;
for (int i = 0; i <= 100; i++) {
System.out.println(i);
num += i;
}
return num;
}
}

如何理解实现Callable接口的方式比创建多线程和实现Runnable接口的方式强大?

如何理解实现Callable接口的方式比创建多线程和实现Runnable接口的方式强大?
1: call方法可以有返回值
2: call方法可以抛出异常被外面的操作捕获, 获取异常信息
3: Callable是支持泛型的

二: 线程池

JDK 5.0起提供了线程池相关API:ExecutorService 和 Executors

ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor

Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池

ExecutorService 不能直接手动建立洗澡池子(线程)池子, 需要用工具一个铁湫之类的工具(Executors)来帮助建立线程.

Executors工具类的方法

 Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池
 Executors.newFixedThreadPool(n); 创建一个可重用固定线程数的线程池
 Executors.newSingleThreadExecutor() :创建一个只有一个线程的线程池
 Executors.newScheduledThreadPool(n):创建一个线程池,它可安排在给定延迟后运 行命令或者定期地执行。

线程池创建的步骤:

1: ExecutorService 使用工具Executors创建线程池
2: 得到的对象使用对应线程的方法submit()或者execute() 操作对应线程
3: shutdown()停止线程

eg:

public class ExecutorsTest {
public static void main(String[] args) {
// 提供指定线程池的数量
// ExecutorService service = Executors.newFixedThreadPool(10); // //执行指定的线程的操作,需要提供实现Runnable或者Callable接口的实现的对象
service.submit(); // 适合使用于Callable
service.execute(); // 适合适用于Runnable //关闭线程连接
// service.shutdown(); ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new RunnableT());
executorService.submit(new RunnableT());
executorService.shutdown(); }
}
import java.util.concurrent.*;

public class CallableTestThree {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
RunnableTT runnableTT = new RunnableTT();
CallableTT callableTT = new CallableTT(); executorService.submit(callableTT); // submit可以对Callable 和Runnable接口的实现对象进行操作
executorService.submit(runnableTT); //executorService.execute(callableTT); // execute()不可以获取 callable接口的实现对象 因为他只能对Runnable接口的实现对象进行操作 executorService.shutdown();
} } class RunnableTT implements Runnable{
@Override
public void run() {
System.out.println("这是取偶数");
for (int i = 0; i <= 100 ; i++) {
if(i % 2 == 0){
System.out.println(i);
}
}
}
} class CallableTT implements Callable{
@Override
public Object call() throws Exception {
System.out.println("这是取奇数");
for (int i = 0; i <= 100 ; i++) {
System.out.println(i);
}
return null;
}
}

Executors工具的操作线程方法一般分为两种

submit(): 一般操作Callable

一般主要是操作Callable接口的线程对象, 偶尔可以用于Runnable接口实现的对象,推荐用Callable接口实现的对象

用来操作实现Callable 接口和Runnable接口的线程对象 , 两者都可以

execute():  一般操作Runnable

只可以操作实现Runnable的接口线程对象

多线程可以理解为一个公交车 一个人就是线程, 你平时是自己走路快还是坐公交快和便捷呢?

肯定是坐公交,你不需要管线程池的问题 只需要管你自己就好了, 因为池子可以装多个线程公交可以装多个人

JDK 5.0 新增解决线程安全 Callable接口和线程池的更多相关文章

  1. 创建线程的方式三:实现Callable接口 --- JDK 5.0新增

    /** * 创建线程的方式三:实现Callable接口. --- JDK 5.0新增 * * * 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? * 1 ...

  2. 实现Callable接口创建线程

    创建执行线程有四种方式: 实现implements接口创建线程 继承Thread类创建线程 实现Callable接口,通过FutureTask包装器来创建线程 使用线程池创建线程 下面介绍通过实现Ca ...

  3. 通过Callable接口创建线程

    通过Callable接口创建线程 一.前言 Java中创建线程的方式有四中,前两种在前面我已经详细介绍过了(Runnable和Thread),不清楚的朋友们可看这里: Java多线程之线程的启动以及J ...

  4. 创建线程的方式三:实现Callable接口。 --- JDK 5.0新增

    如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? call()可以有返回值的.call()可以抛出异常,被外面的操作捕获,获取异常的信息Callable是 ...

  5. 使用Callable接口创建线程和使用线程池的方式创建线程

    1.使用Callable接口的方式实现多线程,这是JDK5.0新增的一种创建多线程的方法 package com.baozi.java2; import java.util.concurrent.Ca ...

  6. 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全

    1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...

  7. Callable接口实现线程

    public class CallableDemo { public static void main(String[] args) throws Exception, ExecutionExcept ...

  8. Java之创建线程的方式三:实现Callable接口

    import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util ...

  9. 创建线程的方式三:实现Callable接口-----JDK5.0 新增

    package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...

随机推荐

  1. (一:NIO系列)JAVA NIO 简介

    出处:JAVA NIO 简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O, ...

  2. django 开发中数据库做过什么优化??

    1.设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能: 2.使用缓存,减少对数据库的访问: 3.在 orm 框架下设置表时,能用 varchar 确定字段长度时,就别用 text: 4.可以 ...

  3. sqlserver 高版本迁移到低版本

    奇葩事不少,  这不, 得把 sqlserver 2014 迁移到 2012 开始以为用备份再还原的方法就可以, 谁知道最终兼容性的问题无法解决(低版本不兼容高版本备份的文件, 即便在高版本中选择了兼 ...

  4. TensorFlow——MNIST手写数字识别

    MNIST手写数字识别 MNIST数据集介绍和下载:http://yann.lecun.com/exdb/mnist/   一.数据集介绍: MNIST是一个入门级的计算机视觉数据集 下载下来的数据集 ...

  5. C# 列出并删除一个文件夹下的所有MD5值相同的文件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. python面向对象--包装标准类型及组合方式授权

    # 实现授权是包装的一个特性.包装一个类型通常是对已存在的类型进行一些自定义定制, # 这种做法可以新建,修改,或删除原有产品的某些功能,而其他的保持不变. # 授权的过程,其实也就是所有的更新功能都 ...

  7. springboot cache---本地缓存的使用

    使用缓存的几个注解 什么时候需要使用缓存呢?一般是在一个方法的返回值需要被频繁用到.但是返回值很少改变而且执行这个方法会消耗较多的时间,这种情况我们可以考虑将返回值暂时存到内存中,需要时通过对应的唯一 ...

  8. 3.xml的解析

    1.xml的解析原理简介(xml是标记型文档) (1)js使用dom解析标记型文档(html)? - 根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象 - d ...

  9. re正则常用示例积累

    2019-12-7 import re ''' 示例1: 提取网站的网址 ''' urls = ['https://blog.csdn.net/xxcupid/article/details/5199 ...

  10. php array_key_exists()函数 语法

    php array_key_exists()函数 语法 作用:检查某个数组中是否存在指定的键名.大理石平板价格 语法:array_key_exists(key,array) 参数: 参数 描述 key ...