补充-jdk5新增多线程实现方式
创建多线程的原始两种方式
1、继承Thread类
2、实现Runable接口
jdk5新增的两种方式
1、实现Callable接口
jdk5:新增创建线程方式:实现Callable
* 与使用Runnable相比,Callable功能更强大
* 1、相比run() 方法,可以有返回值
* 2、方法可以抛出异常
* 3、支持泛型的返回值
* 4、需要借助FutureTask类,比如获取返回结果
* Futrue接口
* 1、可以对具体Runnable、Callable任务的执行结果进行取消、查询、是否完成、获取结果等
* 2、FutureTask同时实现了Runnable、Future接口。它既可以作为Runnable被线程执行,
* 又可以作为Future得到Callable的返回值
如何理解实现Callable接口比实现Runnable接口创建多线程的功能强大
* 1、创建call方法可以有返回值
* 2、可以抛出异常,被外面操作捕获,获取异常信息
* 3、Callable支持泛型 (安全)
package callable_test; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; /**
* 创建线程的方式三:
* jdk5:新增创建线程方式:实现Callable
* 与使用Runnable相比,Callable功能更强大
* 1、相比run() 方法,可以有返回值
* 2、方法可以抛出异常
* 3、支持泛型的返回值
* 4、需要借助FutureTask类,比如获取返回结果
*
* Futrue接口
* 1、可以对具体Runnable、Callable任务的执行结果进行取消、查询、是否完成、获取结果等
* 2、FutureTask同时实现了Runnable、Future接口。它既可以作为Runnable被线程执行,
* 又可以作为Future得到Callable的返回值
*
* 如何理解实现Callable接口比实现Runnable接口创建多线程的功能强大
* 1、创建call方法可以有返回值
* 2、可以抛出异常,被外面操作捕获,获取异常信息
* 3、Callable支持泛型 (安全)
* @author Gary
* @time 2019年8月22日
*/ //1、创建一个实现Callable接口的实现类
class NumThread2 implements Callable {
int sum = 0; //2、实现call方法 类同run()
public Object call() throws Exception {
for(int i=0; i<100; i++) {
if(i%2==0) {
System.out.println(Thread.currentThread().getName()+"="+i);
sum += i;
}
}
return sum;
} } public class TestCallable { public static void main(String[] args) {
//3、创建Callable接口实现类的对象
NumThread2 numT2 = new NumThread2();
//4、将次Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象
FutureTask<NumThread2> ft = new FutureTask<NumThread2>(numT2); Thread thread = new Thread(ft);
thread.start(); try {
//6、获取Callable中call方法的返回值
//get方法的返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值 Object sum = ft.get();
System.out.println("ft.get() = "+sum
);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
2、使用线程池
* ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor
* void execute(Runnable command): 执行任务、命令,没有返回值,一般用来执行Runnable
* <T>Future<T>submit(Callable<T>task): 执行任务,有返回值,一般用来执行Callable
* void shutdown(): 关闭连接池
*
* 使用线程池创建线程
* Executors: 工具类,线程池的工厂类,用于创建并返回不同类型的线程池
* Executors.newCachedThreadPool(): 创建一个可根据需要创建新线程的线程池
* Executors.newFixedThreadPool(): 创建一个可重用固定线程数的线程池
* Executors.newSingleThreadExecutor(): 创建一个只有一个线程额线程池
* Executors.newScheduledThreadPool(n): 创建一个线程池,他可安排在给定延迟后运行命令或者定期的执行
*
* 创建多线程有4中方式:
* 1、继承Thread类
* 2、实现Runnable接口
* 3、实现Callable接口
* 4、使用多线程
package pool; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor; /**
* ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor
* void execute(Runnable command): 执行任务、命令,没有返回值,一般用来执行Runnable
* <T>Future<T>submit(Callable<T>task): 执行任务,有返回值,一般用来执行Callable
* void shutdown(): 关闭连接池
*
* 使用线程池创建线程
* Executors: 工具类,线程池的工厂类,用于创建并返回不同类型的线程池
* Executors.newCachedThreadPool(): 创建一个可根据需要创建新线程的线程池
* Executors.newFixedThreadPool(): 创建一个可重用固定线程数的线程池
* Executors.newSingleThreadExecutor(): 创建一个只有一个线程额线程池
* Executors.newScheduledThreadPool(n): 创建一个线程池,他可安排在给定延迟后运行命令或者定期的执行
*
* 创建多线程有4中方式:
* 1、继承Thread类
* 2、实现Runnable接口
* 3、实现Callable接口
* 4、使用多线程
* @author Gary
* @time 2019年8月22日
*/
public class Test1 { public static void main(String[] args) { //1、提供指定线程数量的线程池
ExecutorService service = Executors.newFixedThreadPool(3);
ThreadPoolExecutor service1 = (ThreadPoolExecutor)service;
// 设置线程池的属性
service1.setCorePoolSize(2);
System.out.println(service.getClass());
//2、执行指定的线程的操作,需要提供实现的Runnable接口或Callable接口实现类对象
service.execute(new NumberThread()); //适用于Runnable
service.execute(new NumberThread());
//3、关闭连接池
service.shutdown();
// service.submit(); // 适用于Callable
}
} class NumberThread implements Runnable { public void run() {
for(int i=0; i<100; i++) {
System.out.println(Thread.currentThread().getName()+"=="+i);
}
}
}
补充-jdk5新增多线程实现方式的更多相关文章
- 二、java实现多线程的方式?
一.同步?异步? 下面两幅图解释了同步异步. 二.实现多线程的方式 1.继承Thread package threaddemo; class CreateThreadDemo extends Thre ...
- java中创建多线程的方式
在java中比较常用的有三种创建多线程的方式. 方式一:继承Thread类,要重写run方法. 在MyThread类 public class MyThread extends Thread { @O ...
- 实现多线程的方式之实现Callable接口
package com.hls.juc; import java.util.concurrent.Callable;import java.util.concurrent.ExecutionExcep ...
- CSS3 新增颜色表示方式
一.CSS1&2颜色表示方式(W3C标准) 1.Color name 颜色名称方式(用颜色关键字表示对应的颜色.) 例如:red(红色).blue(蓝色).pink(粉色) 优点:方便快捷而 ...
- Java基础加强之并发(二)常用的多线程实现方式
概述 常用的多线程实现方式有2种: 1. 继承Thread类 2. 实现Runnable接口 之所以说是常用的,是因为通过还可以通过JUC(java.util.concurrent)包中的线程池来实现 ...
- Java中有两种实现多线程的方式以及两种方式之间的区别
看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thre ...
- 多线程实现方式---实现Runnable接口
多线程实现方式---实现Runnable接口 一个类如果需要具备多线程的能力,也可以通过实现java.lang.Runnable接口进行实现.按照Java语言的语法,一个类可以实现任意多个接口,所以该 ...
- 实现多线程的方式Runnable
package com.thread.runnable; /** * 实现多线程的方式有继承Thread类和实现Runnable接口两种方式 * 哪种方式更好呢?实现的方式由于继承的方式. * 原因: ...
- Java多线程引例及实现多线程的方式
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术. Java多线程是由JVM来实现,不必关心操作系统的调用问题. 假如我们要实现如下功能: public c ...
- iOS中的几种锁的总结,三种开启多线程的方式(GCD、NSOperation、NSThread)
学习内容 欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary OC中的几种锁 为什么要引入锁 ...
随机推荐
- absible笔记第一章 (ansibles基础与playbook常用模块)
一. ansibles基础与playbook 1.优先级问题 ANSIBLE_CONFIG ansible.cfg 项目目录 ...
- java使用MVC编程模型实现1+到100图形界面
MVC概念 MVC编程模型是可以说从提出到现在经久不败,是一种先进的设计结构.能很好的体现个人分工,从而实现前后端分离. M(Model):模型:存储数据的对象.后端操作数据库的. V(View):视 ...
- Beaver解析代码反向生成语法文件
背景 Beaver是一款LALR的语法生成工具,现在有一个反编译项目的需求,需要将Beaver语法文件编译后的代码反向生成语法文件的需求,不去评论需求多么傻逼,直接干 设计 flowchart 语法文 ...
- git(后悔药)版本回退
版本回退 查看提交记录 git log remotes/origin/test --pretty=oneline (建议获取远程日志记录,防止本地没有更新到最新版本) 如果本地是最新版本可以使用:gi ...
- facade是如何产生的 in laravel
据说Facade是为了简化写法, 好记,也有人说要废除这个特性, 据说这个特性有很好的的testability 测试性, 我不清楚, 这个是怎么说出来的理由是什么? 很多Facade 是系统写好的, ...
- Mybatis拦截器,修改Date类型数据。设置毫秒为0
1:背景 Mysql自动将datetime类型的毫秒数四舍五入,比如代码中传入的Date类型的数据值为 2021.03.31 23:59:59.700 到数据库 2021.04.01 0 ...
- linux:day01 计算机基础 随堂笔记 马
本课程内容目录(前30天) 一,计算机基础 1,机械硬盘是比较慢的,如果有条件的话,还是换成固态硬盘有个120G就够了,价钱大概500G 700元 2,视频从一台机器拷贝到另外一台机器,复制的时候要限 ...
- Win10使用打印机0x0000011b错误 如何处理(没有KB5005565补丁如何解决??)
1.排查问题 win10连接打印机共享错误显示0x0000011b怎么解决?很多用户在更新了windows系统的最新补丁后,突然发现自己打开打印机的时候提示"无法连接到打印机,错误为0x00 ...
- Bug_Android error: duplicate attribute. (错误:重复属性。)
error: duplicate attribute. 错误:重复属性. 如报错信息提示,属性重复赋值了 场景:刚拿到项目源码,进行修改前,先设置它的背景色,区分是哪一块内容,但没看到组件已定义了背景 ...
- 37.Spring注解相关面试题
1.@Resource和@Autowired 区别 2.@Repository.@Component.@Service.@Controller 区别