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 ...
随机推荐
- zk mysql 主从自动切换
zookeeper测试: DBI 版本: /DBI-1.616# zjtest7-redis:/root/DBD-mysql-4.031# perl Makefile.PL Can't exec &q ...
- Zabbix Step 1 : Install CentOS6.5 and Configration
[root@myzabbix Desktop]#rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2- ...
- Android Bluetooth开发
原文地址:http://developer.android.com/guide/topics/wireless/bluetooth.html 翻译:jykenan 更新:2012.06.19 Andr ...
- 更换Winform 皮肤(下)----完全GDI+绘制
skin皮肤和DLL程序及文件:下载 链接:http://www.cnblogs.com/DebugLZQ/archive/2013/04/15/3021659.html
- [转]CentOS_yum的详细使用方法
yum 是什么yum = Yellow dog Updater, Modified主要功能是更方便的添加/删除/更新RPM包.它能自动解决包的倚赖性问题.它能便于管理大量系统的更新问题 yum特点可以 ...
- Linux下动态库使用
1. 静态库和动态库的基本概念 静态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分:使用静态库编译的程序运行时无需该库文件支持,哪里都可以用, 但是生成的可执行文件较大.动 ...
- android handler looper thread
在线程中调用包含创建handler方法的时候,会报错,提示: “need call Looper.prepare()” -- 在创建之前,调用Looper.prepare()方法来创建一个looper ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序) 基于HTTP-GET的元数据发布方式与基于WS-MEX原理类似,但是ServiceMetad ...
- JVM调优总结(七)-典型配置举例1
以下配置主要针对分代垃圾回收算法而言. 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理 ...
- Java设计模式菜鸟系列(七)命令模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39804057 命令模式(Command):将"请求"(命令/口令)封装 ...