补充-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中的几种锁 为什么要引入锁 ...
随机推荐
- 运用C#编写Http服务器
什么是HTTP服务器 Web服务器是指驻留于因特网上某种类型计算机的程序.当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该 ...
- Linux程序设计
2.6 shell的语法 2.6.1 变量 参数变量 实验:使用参数和环境变量 #!/bin/sh salutation="Hello" echo $salutation ech ...
- php框架之odp-环境部署安装
一.安装配置 1.安装很简单,创建安装目录,然后在linux上使用wget命令从获取地址下载,然后解压,最后在安装目录下执行bin/odp_install即可. 例如:(只是举例,请安装最新的版本) ...
- 阿里云ECS部署单机kafka 并对外提供服务(带认证)
1. zk配置(单机) zoo.cfg tickTime=2000initLimit=10syncLimit=5dataLogDir=/data/zookeeper/log/dataDir=/data ...
- CART回归树算法
[题目1] 表1为拖欠贷款人员训练样本数据集,使用CART算法基于该表数据构造决策树模型,并使用表2中测试样本集确定剪枝后的最优子树. 表1 拖欠贷款人员训练样本数据集 编号 房产状况 婚姻情况 年收 ...
- 把userId:12323 直接拿到12323
JSONObject jsonObject1 = JSONObject.parseObject(mqttMessage); MessageVo messageVo = JSONObject.toJa ...
- IDEA 开发SSM
1.配置MAVEN 2.初始化SpringBoot 官网API:https://spring.io/projects/spring-boot 初始化SpringBoot:https://start.s ...
- Android Custom View使用Databinding
Android Custom View是可以使用 databinding 的 //java.lang.IllegalArgumentException: View is not a binding l ...
- 【Python】语言的控制流程
二.Python语言的控制流程 1.程序的组织结构 1.1 顺序结构:从上到下顺序的执行代码,直到程序结束,没有任何判断和跳转 1.2 选择结构:根据判断条件的布尔值选择性的执行部分代码:if语句 1 ...
- as8051入门
汇编例子 MAIN: MOV R0, #16 MOV R1, #16 LOOP: MOV A, R1 MOV @R0,A MOV A,0x0 MOV A, @R0 MOV SBUF, A INC R0 ...