[Java] 转:多线程 (并发)总结

  1. 一概念

  2. 二创建多线程方法

  3. 三线程常用方法不完整可以自己查阅JDK文档

  4. 四线程的生命周期与转换

  5. 五同步

  6. 六竞争者消费者

  7. 七线程池

  8. 八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 生产者消费者

http://zh.wikipedia.org/wiki/%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98

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

七、线程池

为什么要用线程池:

  1. 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务

  2. 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约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

集合

参考资料:

《新写了一个Java并发程序设计教程》

最简实例说明wait、notify、notifyAll的使用方法
http://longdick.iteye.com/blog/453615

转自:http://blog.csdn.net/androiddevelop/article/details/17205551

[Java] 转:多线程 (并发)总结,布布扣,bubuko.com

时间: 2024-10-03 13:20:11

[Java] 转:多线程 (并发)总结的相关文章

Java核心-多线程-并发控制器-Semaphore信号量

Semaphore是非常有用的一个多线程并发控制组件(Java还有CountDownLatch.CyclicBarrier.Exchanger多线程组件),它相当于是一个并发控制器,是用于管理信号量的.构造的时候传入可供管理的信号量的数值,这个数值就是控制并发数量的,就是同时能几个线程访问.我们需要控制并发的代码,执行前先通过acquire方法获取信号,执行后通过release归还信号 .每次acquire返回成功后,Semaphore可用的信号量就会减少一个,如果没有可用的信号,acquire

Java接口多线程并发测试 (二)

原文地址http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html 这是一篇很不错的文章,感谢原博主的分享! JAVA多线程实现和应用总结 最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结.1.JAVA多线程实现方式JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种

Java实现多线程并发

1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 import java.util.concurrent.Semaphore; 4 5 public class ThreadTest { 6 private static int thread_num = 500; 7 private static int client_num = 5000; 8 9 public s

[Java复习] 多线程 并发 JUC 补充

线程安全问题? 当多个线程共享同一个全局变量,做写的操作时,可能会受到其他线程的干扰.读不会发生线程安全问题. --  Java内存模型. 非静态同步方法使用什么锁? this锁 静态同步方法使用什么锁? 当前类的字节码文件 什么是ThreadLocal? ThreadLocal是给每个线程提供局部变量,每个线程可独立改变自己的副本,不会影响其他线程所对应的副本,解决线程安全问题. ThreadLocal底层原理是map集合. ThreadLocal内存泄漏问题? 由于ThreadLocalMa

java多线程并发编程与CPU时钟分配小议

我们先来研究下JAVA的多线程的并发编程和CPU时钟振荡的关系吧 老规矩,先科普 我们的操作系统在DOS以前都是单任务的 什么是单任务呢?就是一次只能做一件事 你复制文件的时候,就不能重命名了 那么现在的操作系统,我一边在这边写BLOG,一边听歌,一边开着QQ,一边…………………… 显然,现在的操作系统都是多任务的操作系统 操作系统对多任务的支持是怎么样的呢? 每打开一个程序,就启动一个进程,为其分配相应空间(主要是运行程序的内存空间) 这其实就支持并发运行了 CPU有个时钟频率,表示每秒能执行

多线程并发

转于http://m.blog.csdn.net/blog/haolongabc/7249098 浅谈java内存模型        不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的.其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改.总结java的内存模型,要解决两个主要的问题:可见性和有序性.我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内存的.JVM定义了自己的内存模型,屏蔽了底层平台

Java基础】并发 - 多线程

Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数并发应用程序时围绕执行任务(task)进行管理的:所谓任务就是抽象的,离散的工作单元. 围绕执行任务来管理应用程序时,第一步是要指明一个清晰的任务边界.大多数应用服务器程序都选择了下面这个自然的任务辩解:单独的客户请求: 任务时逻辑上的单元: 任务 Runnable 表示一个任务单元(java.lang)

java 多线程并发问题总结

java 多线程并发主要通过关键字synchronized实现 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该ob

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可