java 多线程-4
十四、sleep方法和wait方法的区别
【面试题】
- 相同点:
- 一旦执行方法,都可以使得当前线程进入阻塞状态。
- 不同点:
- 两个方法的声明位置不同:Thread类声明sleep();Object类中声明wait()
- 调用的要求不同:sleep()可以在任何需要的场景下调用;wait()必须使用在同步代码块或者同步方法中
- 关于是否收释放同步监视器:如果有两个方法都使用在同步代码块或同步方法中,sleep()不会释放同步监视器,而wait方法会释放锁
十五、JDK5.0新增线程创建方式
因此,java中有四种创建多线程的方式:
- 继承Thread类,重写run方法
- 实现Runnlable接口,重写run方法
- 实现Callable接口,重写cal方法
- 使用线程池【真实开发中,多数情况下使用的是线程池的方式】
15.1 新增方式一:实现Callable接口
15.1.1 Callable接口简介
- 与使用Runnable相比, Callable功能更强大些 :
- 相比run()方法,可以有返回值
- 方法可以抛出异常
- 支持泛型的返回值
- 需要借助FutureTask类,比如获取返回结果
15.1.2 借助Future接口
Future接口
- 可以对具体Runnable、Callable任务的执行结果进行取消、查询是 否完成、获取结果等。
- FutrueTask是Futrue接口的唯一的实现类
- FutureTask 同时实现了Runnable, Future接口。它既可以作为 Runnable被线程执行 ,又可以作为Future得到Callable的返回值
15.1.3 列子
/**
* 创建线程的方式三:实现Callable接口
*/
public class RunCallable {
public static void main(String[] args) {
// 第三步:创建callable接口的实现类的对象
ThreadCallable threadCallable = new ThreadCallable();
// 第四步:将threadCallable对象传入到FutureTask构造器中,创建futureTask对象
// 【FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值】
FutureTask futureTask = new FutureTask(threadCallable);
// 第五步:将futureTask作为参数,传递到Thread类构造器中,创建Thread对象,并调用start方法
Thread thread = new Thread(futureTask);
// 第六步:开启线程
thread.start();
try {
// 第七步:获取callable中cal方法的返回值
// get方法获取返回值
Object o = futureTask.get();
System.out.println("总和为:"+o);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
// 第一步:实现Callable接口
class ThreadCallable implements Callable{
private int sum;
// 第二步:重写run方法
@Override
public Object call() throws Exception {
for (int i = 0; i <= 100; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
sum += i;
}
/*返回值是Object类型的,但是为什么return sum没有报错?
* 因为这里做了一个自动装箱操作,即把int型的sum,转为Integer,而Integer继承Object类,因此没有报错
* */
return sum;
}
}
15.2 新增方式二:使用线程池
15.2.1 线程池简介
背景:
经常创建和销毁、使用量特别大的资源,比如并发情况下的线程, 对性能影响很大。
思路:
提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。
好处:
- 提高响应速度(减少了创建新线程的时间)
- 降低资源消耗(重复利用线程池中线程,不需要每次都创建)
- 便于线程管理
- corePoolSize:核心池的大小
- maximumPoolSize:最大线程数
- keepAliveTime:线程没有任务时最多保持多长时间后会终止
15.2.2 线程池API
线程池相关API
JDK 5.0起提供了线程池相关API:ExecutorService 和 Executors
ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor
- void execute(Runnable command) :执行任务/命令,没有返回值,一般用来执行 Runnable
- Future submit(Callable task):执行任务,有返回值,一般用来执行 Callable
- void shutdown() :关闭连接池
Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池
- Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池
- Executors.newFixedThreadPool(n); 创建一个可重用固定线程数的线程池
- Executors.newSingleThreadExecutor() :创建一个只有一个线程的线程池
- Executors.newScheduledThreadPool(n):创建一个线程池,它可安排在给定延迟后运 行命令或者定期地执行。
15.2.3 列子
public class ThreadPool {
public static void main(String[] args) {
// 第一步:提供指定线程数量的线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
// executorService.submit();// 适合使用于callable
// 第二步:执行指定的线程的操作,需要提供实现Runnable接口或Callable接口实现类的对象
TestRunnable testRunnable = new TestRunnable();
TestRunnable2 testRunnable2 = new TestRunnable2();
executorService.execute(testRunnable);// 适合使用于runnable
executorService.execute(testRunnable2);// 适合使用于runnable
// 第三步:关闭线程池子
executorService.shutdown();
}
}
class TestRunnable implements Runnable{
private int i = 0;
@Override
public void run() {
while (true) {
if (i < 101) {
System.out.println(Thread.currentThread().getName()+"=======:"+i);
i++;
}else {
break;
}
}
}
}
class TestRunnable2 implements Runnable{
private int i = 0;
@Override
public void run() {
while (true) {
if (i < 101) {
System.out.println(Thread.currentThread().getName()+"&&&&&&&&"+i);
i++;
}else {
break;
}
}
}
}
java 多线程-4的更多相关文章
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java多线程 2 线程的生命周期和状态控制
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
- java 多线程 1 线程 进程
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报 分类: javaSE综合知识点(14) 版权声明:本文为博主原创文章,未经博 ...
- 一起阅读《Java多线程编程核心技术》
目录 第一章 Java多线程技能 (待续...)
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
随机推荐
- Jmeter 常用函数(4)- 详解 __setProperty
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 前言 有看我之前写的 Jmeter 文章的童 ...
- NeuroAttack: Undermining Spiking Neural Networks Security through Externally Triggered Bit-Flips
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:2005.08041v1 [cs.CR] 16 May 2020 Abstract 由于机器学习系统被证明是有效的,因此它被广 ...
- IDEA下Maven项目搭建踩坑记----3.最长的bug,最简单的错误。同一类中,部分函数的@AutoWired注入的对象失效
这个错误绝对是我写到现在为止最傻X的一个错误,先上图 问题: 出了一个特别长的错误,大致的意思就是mapper.xml文件注入Dao层的时候失败. 解决: 查看一下错误的位置→ 找到Dao层 找到错误 ...
- IdentityServer4中ResourceOwnerPassword模式获取accecc_token,并使用refresh_token刷新accecc_token
一.IS4服务端配置 1.配置Client new Client { ClientId = "xamarin", ClientSecrets = { new Secret(&quo ...
- 赫然:Windows Live Writer 批量博客更新软件使用教程
http://www.wocaoseo.com/thread-144-1-1.html 推广人员需要使用多个博客,一个一个登陆更新是很麻烦的事情,网上的桌面批量更新博客软件也不少,今天在此推荐大家使用 ...
- 使用intellij IDEA远程连接服务器部署项目
由于不想每次打开上传的文件软件,故研究使用intellij IDEA集成 ,下面是我使用的过程的一些记录. 使用intellij 远程连接服务器连接Linux服务器部署项目,方便我们开发测试. 本人使 ...
- Java程序员博客系统推荐!我调研了100来个 Java 开源博客系统,发现这 5 个最好用!
大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 最近想倒腾一下博客,看了很多现成的比较成熟的开源博客系统,自己也简单从下面几个维度总结对比了一下: star数量 ...
- Android开发之Toast吐司的一个封装好的工具类。带有源代码java文件,
import android.content.Context; import android.widget.Toast; //Toast统一管理类 public class T { private T ...
- Unity游戏Mono内存管理及泄漏
UWA工具 https://yq.aliyun.com/articles/435553 Unity游戏Mono内存管理及泄漏 https://wetest.qq.com/lab/view/135.ht ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II
题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...