[Java] 转:多线程 (并发)总结
- 一概念
- 二创建多线程方法
- 三线程常用方法不完整可以自己查阅JDK文档
- 四线程的生命周期与转换
- 五同步
- 六竞争者消费者
- 七线程池
- 八JDK 线程工具
线程基础:
1. 创建
2. 状态切换
3. sleep与wait的区别
前者使线程阻塞固定时间后进入Runnable状态,后者使用notify后可以处于可执行状态。
4. synchroized 与 Lock 区别
synchroized 可以针对当前对象、某变量设置相应的对象锁
lock 控制粒度更细,使用ReentrantLook.look(); 锁定 ,使用ReentrantLook.unlook();解除锁定。
5. Atomic工具类
例如:AtomicInteger 可以确保读写时线程安全。
6. 线程池
Executors 以下方法方法获取ExecutorService
newCacheThreadPool
newFixedThreadPool 固定大小
newSingleThreadPool 仅一个线程
ExecutorService.submit(Futrue )
Futrue
7. 自定义线程池
8. 生产者消费者
生产者生产产品 - 放入 - 仓库
消费者从仓库 - 拿出 - 产品
有多个生产者与多个消费者,他们会同时进行操作,所以当仓库库存不够是使用wait让线程处于等待。
此时生产者进行生产,满足一定条件后,停止生产通知notify消费者消费
一、概念
1. 维基百科解释
进程是什么?
http://zh.wikipedia.org/wiki/%E8%BF%9B%E7%A8%8B
线程是什么?
http://zh.wikipedia.org/wiki/%E5%9F%B7%E8%A1%8C%E7%B7%92
2. 一个巧妙的比喻
《进程与线程的一个简单解释》 简单摘要如下
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
计算机概念
类比
CPU
一座工厂
单CPU一次执行一个任务
电力有限,一次只能供给一个车间使用
进程
工厂的车间
线程
车间里面的工人
线程并发
一个车间很多工人
进程的内存是共享的,每个线程都能使用
车间弓箭是工人们共享
一个线程使用内存空间时,其他线程必须等它结束
车间厕所,有人时其他人不能进入
“互斥锁”
厕所上加个锁,进入时锁上
某内存空间,仅供固定数目线程使用
厨房可以同时容纳多个人
“信号量”
挂N把锁,进入的人拿钥匙锁上,出来时放回
二、创建多线程,方法
(1)Runnable接口 (通常选择这种,接口本身可以实现多重继承,比较灵活)
1.子类,实现Runnable接口
2.子类要覆写Thread类中的run方法
3.子类引用对象,Thread t1 = new Thread(d1); 必须声明为Thread类型
4.使用start()方法,启动多线程
(2)java.lang.Thread类 (实现了Runnable)
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时间片,但是只让出一小会,并不是永远让出不执行
四、线程的生命周期与转换
五、同步
1. synchronized()
在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应于一个可成为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问对象。
2. 锁
synchronized和java.util.concurrent.locks.Lock区别?
相同的是Lock能完成synchronized所实现的所有功能
不同在与是Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
六、竞争者、消费者
资料:
1. Java线程:并发协作-生产者消费者模型
http://lavasoft.blog.51cto.com/62575/221932
2. WIKI 生产者消费者
3. Java多线程-并发协作(生产者消费者模型)
http://www.cnblogs.com/linjiqin/p/3217050.html
4. 架构设计:生产者/消费者模式[0]:概述
http://program-think.blogspot.com/2009/03/producer-consumer-pattern-0-overview.html#index
七、线程池
为什么要用线程池:
- 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
- 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)
《创建线程池》
http://sunnylocus.iteye.com/blog/223327
聊聊并发(三)——JAVA线程池的分析和使用
http://www.infoq.com/cn/articles/java-threadPool
Java 线程池学习
http://www.cnblogs.com/jersey/archive/2011/03/30/2000231.html
八、JDK 线程工具
Executors
Callable/Future
Lock/Condition
Semaphore 信号灯
CyclicBarrier
CountDownLatch
Exhanger
集合
参考资料:
最简实例说明wait、notify、notifyAll的使用方法
http://longdick.iteye.com/blog/453615
转自:http://blog.csdn.net/androiddevelop/article/details/17205551
[Java] 转:多线程 (并发)总结的更多相关文章
- Java接口多线程并发测试 (一)
本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...
- Java核心-多线程-并发控制器-Semaphore信号量
Semaphore是非常有用的一个多线程并发控制组件(Java还有CountDownLatch.CyclicBarrier.Exchanger多线程组件),它相当于是一个并发控制器,是用于管理信号量的 ...
- Java核心-多线程-并发控制器-CountDownLatch倒数闩
1.基本概念 CountDownLatch,中文名倒数闩,jdk并发工具包中一个并发控制器,它抽象了一个常见的多线程并发场景,开发人员使用它可以写出同时兼顾线程安全性与高效率的代码. 2.抽象模型 相 ...
- Java接口多线程并发测试 (二)
原文地址http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html 这是一篇很不错的文章,感谢原博主的分享! JAVA多线程实现和 ...
- Java中多线程并发体系知识点汇总
一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...
- [Java复习] 多线程&并发 知识点补充
0. wait/notify/notifyAll的理解? wait:让持有该对象锁的线程等待: notify: 唤醒任何一个持有该对象锁的线程: notifyAll: 唤醒所有持有该对象锁的线程: 它 ...
- Java核心-多线程-并发控制器-CyclicBarrier同步屏障
1.基本概念 中文译本同步屏障,同样来自jdk并发工具包中一个并发控制器,它的使用和CountDownLatch有点相似,能够完成某些相同并发场景,但是它们却不相同. 2.抽象模型 主要用来实现多个线 ...
- Java实现多线程并发
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...
- [Java复习] 多线程 并发 JUC 补充
线程安全问题? 当多个线程共享同一个全局变量,做写的操作时,可能会受到其他线程的干扰.读不会发生线程安全问题. -- Java内存模型. 非静态同步方法使用什么锁? this锁 静态同步方法使用什么 ...
- Java核心-多线程-并发控制器-Exchanger交换器
1.基本概念 Exchanger,从名字上理解就是交换.Exchanger用于在两个线程之间进行数据交换,注意也只能在两个线程之间进行数据交换. 线程会阻塞在Exchanger的exchange方法上 ...
随机推荐
- 创建Android Virtual Device
参考http://book.51cto.com/art/201302/380026.htm Linux版的Android SDK没有提供可视化的AVD Manager管理工具,创建AVD可以使用and ...
- oracle根据正则表达式查找对应的字段
语法如下: SELECT * FROM 表名WHERE regexp_like(表字段,'正则') 例如: 查找某字段小数点后有两个小数以上的信息 SELECT * FROM A TWHERE reg ...
- HDU 4035Maze(概率DP)
HDU 4035 Maze 体会到了状态转移,化简方程的重要性 题解转自http://blog.csdn.net/morgan_xww/article/details/6776947 /** dp ...
- CodeForces 711C Coloring Trees (DP)
题意:给定n棵树,其中有一些已经涂了颜色,然后让你把没有涂色的树涂色使得所有的树能够恰好分成k组,让你求最少的花费是多少. 析:这是一个DP题,dp[i][j][k]表示第 i 棵树涂第 j 种颜色恰 ...
- DNS原理及其解析过程(转)
转自(http://369369.blog.51cto.com/319630/812889) 网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如 ...
- Java垃圾回收器
一.Java垃圾回收器要负责完成以下3个任务: 1.分配内存 2.确保被引用对象的内存不被错误回收 3.回收不再被引用的对象的内存空间 二.垃圾回收是一个复杂而又耗时的操作.如果JVM花费过多的时间在 ...
- preventDefault stopPropagation??
棒棒哒~ event.preventDefault https://developer.mozilla.org/zh-CN/docs/Web/API/Event/preventDefault stop ...
- (剑指Offer)面试题25:二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 二叉树结点的定义: struct TreeNode ...
- Docker 入门教程
几个月以前,红帽(Red Hat)宣布了在 Docker 技术上和 dotCloud 建立合作关系.在那时候,我并没有时间去学习关于 Docker 的知识,所以在今天,趁着这个 30 天的挑战,我决定 ...
- JavaScript 各种遍历方式详解,有你不知道的黑科技
http://segmentfault.com/a/1190000003968126 为了方便例子讲解,现有数组和json对象如下 var demoArr = ['Javascript', 'Gulp ...