补充-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中的几种锁 为什么要引入锁 ...
随机推荐
- APP学习3
1. 常见控件 Button控件 继承自TextView控件,既可以显示文本,又可以显示图片,同时也允许用户通过点击来执行操作,点击效果. onClick属性:先在layout文件中指定onClick ...
- 12-K8S之调度器、预选策略和优选函数
目录 调度器.预选策略和优选函数 1.nodeSelector nodeName调度: 2.节点亲和性调度(pod亲和于node节点) 3.pod亲和度调度(pod亲和于pod) 4.pod反亲和性度 ...
- iOS笔记 - runtime 02:objc_msgSend执行流程
objc_msgSend 执行流程 1 - 第一步:消息发送 2 - 第二步:动态解析 代码示例:resolveInstanceMethod | resolveClassMethod 存在问题:68 ...
- Jenkins自动化部署(linux环境)---安装篇
1.安装java yum install java 2.安装Jenkins wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.or ...
- python读取文本中的字典
首先得明确文本的每行是存的json或者用python的write(str(一个字典))写入的,那么不用借助json模块就能读取为字典,使用eval函数就行,json只能处理带双引号的字符串,但很多时候 ...
- Demo of canvas, canvas optimization and svg
It used the canvas to draw the curves in the old project, and the client felt that it was vague, so ...
- php微信公众号开发之生成带参数的二维码
参考微信公众平台:https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric ...
- SAP物料类型
1.物料主数据界面设置行业领域默认值并隐藏行业领域 2.物料类型设置:主要控制视图需要维护的部门,是否可以采购,及是否进行数量或者价值更新等操作 spro --> 后勤常规--> 物料主数 ...
- taobao.tbk.sc.newuser.order.get( 淘宝客-服务商-新用户订单明细查询 )
淘宝客订单表结构设计(mysql) CREATE TABLE `tbk_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `member_id` bi ...
- password_encryption_type 和 pg_hba.conf 不匹配导致用户连不上
# 问题概述xxx客户新上一套opengauss数据库,在测试中用户输入正确的密码,提示用户密码错误,导致用户被锁# 问题原因password_encryption_type 和 pg_hba.con ...