Java 多线程 (并发)总结
一、概念
| 计算机概念 | 类比 |
| CPU | 一座工厂 |
| 单CPU一次执行一个任务 | 电力有限,一次只能供给一个车间使用 |
| 进程 | 工厂的车间 |
| 线程 | 车间里面的工人 |
| 线程并发 | 一个车间很多工人 |
| 进程的内存是共享的,每个线程都能使用 | 车间弓箭是工人们共享 |
| 一个线程使用内存空间时,其他线程必须等它结束 | 车间厕所,有人时其他人不能进入 |
| “互斥锁” | 厕所上加个锁,进入时锁上 |
| 某内存空间,仅供固定数目线程使用 | 厨房可以同时容纳多个人 |
| “信号量” | 挂N把锁,进入的人拿钥匙锁上,出来时放回 |
二、创建多线程,方法
1.子类,实现Runnable接口
2.子类要覆写Thread类中的run方法
3.子类引用对象,Thread t1 = new Thread(d1); 必须声明为Thread类型
4.使用start()方法,启动多线程
1.子类extends Thread
2.Thread子类要覆写Thread类中的run方法
3.如果要执行一个线程,创建子类的实例化,并且start()方法。使用d1.run()没有使用多线程
三、线程常用方法(不完整,可以自己查阅JDK文档)
| 类名 | 方法 | 功能 |
| Object | wait | 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。(释放对象锁,调用notify继续执行) |
| Object | notify/notifyAll | 唤醒在此对象监视器上等待的单个/所有线程。 |
| Thread | sleep | 在指定的毫秒数内让当前正在执行的线程休眠(不释放对象锁,一段时间后自动执行) |
| Thread | join | 等待该线程终止。再恢复当前线程执行 |
| Thread | getPriority / setPriority | 取得或设置优先级数值 |
| Thread | currentThread | 取得当前运行的线程 |
| Thread | start | 通知线程规划期这个新线程已准备就绪,而且应当在规划的最早方便时间爱你调用他的run()方法。 |
| Thread | isAlive | 用来测试线程是否启动,即线程是否还未终止。 |
| Thread | yield | 让出自己的CPU时间片,但是只让出一小会,并不是永远让出不执行 |
四、线程的生命周期与转换
五、同步
相同的是Lock能完成synchronized所实现的所有功能
不同在与是Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
六、竞争者、消费者
七、线程池
为什么要用线程池:
- 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
- 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)
《创建线程池》
八、JDK 线程工具
Java 多线程 (并发)总结的更多相关文章
- Java多线程-并发容器
Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...
- Java 多线程并发编程一览笔录
Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...
- Java多线程并发技术
Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/a ...
- java 多线程并发问题总结
java 多线程并发主要通过关键字synchronized实现 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问 ...
- 从火箭发场景来学习Java多线程并发闭锁对象
从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size—这种方式来实现.但是在多线程并发的情 ...
- Java多线程并发03——在Java中线程是如何调度的
在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...
- Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗
在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...
- Java多线程并发05——那么多的锁你都了解了吗
在多线程或高并发情境中,经常会为了保证数据一致性,而引入锁机制,本文将为各位带来有关锁的基本概念讲解.关注我的公众号「Java面典」了解更多 Java 相关知识点. 根据锁的各种特性,可将锁分为以下几 ...
- Java多线程并发04——合理使用线程池
在此之前,我们已经了解了关于线程的基本知识,今天将为各位带来,线程池这一技术.关注我的公众号「Java面典」了解更多 Java 相关知识点. 为什么使用线程池?线程池做的工作主要是控制运行的线程的数量 ...
- Java多线程并发07——锁在Java中的实现
上一篇文章中,我们已经介绍过了各种锁,让各位对锁有了一定的了解.接下来将为各位介绍锁在Java中的实现.关注我的公众号「Java面典」了解更多 Java 相关知识点. 在 Java 中主要通过使用sy ...
随机推荐
- c语言指针数组与数组指针
一.指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称.数 ...
- Java--日期的使用
Date 类: 最基础的日期时间类,返回一个相对日期的毫秒数.精确到毫秒,但不支持日期的国际化和分时区显示. Calender类: 相对于Date更加强大的时间类,是抽象类,提供了常规的日期修改功能和 ...
- 基于visual Studio2013解决算法导论之051区间树
题目 区间树 解决代码及点评 #include <stdio.h> #include <string.h> #include <iostream> #def ...
- 自定义的Server
自定义的Server 我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(<聊聊ASP.NET Core默认提供的这个跨平台的服务器——Kes ...
- jstl 保留两位小数
简介:jstl保留两位小数实现方法在JSP开头导入以下标签:<%@tagliburi="http://java.sun.com/jsp/jstl/fmt"pre jstl 保 ...
- android 配置环境变量
在创建AVD时,在DOS下输入android list targets 会出现android不是内部或外部命令,如图-1.这主要是没有配置好android sdk环境变量所致的. 图-1 andr ...
- CQOI2015 选数
题目 从\([L, H]\)(\(H-L\leq 10^5\))选出\(n\)个整数,使得这些数的最大公约数为\(k\)的方案数. 算法 首先有一个很简单的转化,原问题可以简化为: 从\([\lcei ...
- ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected解决方法
在进行物理主备库角色转换的时候遇到ORA-01093错误 SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; ALTER ...
- iOS 使用Block实现函数回调
事实上.iOS中的Block就是C++中的函数指针,实现方式都是一样的,以下贴出一个简单的实践. 首先,创建一个回调的类 BlockStudy.h // // BlockStudy.h // Bloc ...
- 异常:未能载入文件或程序集”DAL”或它的某一个依赖项——解决的方法
以下是我再使用抽象工厂+反射重构机房时,在Factoy中出现了以下一个问题: 去网上查了一下资料,发现这是一个非常普遍的问题,它出现的原因主要有两种: 第一种: 载入DLL路径错误.解决的方法是调整D ...