Java 多线程 (并发)总结

标签: java 多线程 并发 | 发表时间:2013-12-09 05:11 | 作者:love_world_
出处:http://blog.csdn.net

一、概念

1. 维基百科解释
进程是什么?
线程是什么?

2. 一个巧妙的比喻
进程与线程的一个简单解释》 简单摘要如下


计算机概念 类比
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]:概述



七、线程池

为什么要用线程池:

  1. 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
  2. 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

《创建线程池》

聊聊并发(三)——JAVA线程池的分析和使用

Java 线程池学习


八、JDK 线程工具

Executors
Callable/Future
Lock/Condition
Semaphore 信号灯
CyclicBarrier
CountDownLatch
Exhanger
集合






作者:love_world_ 发表于2013-12-8 21:11:32 原文链接
阅读:0 评论:0 查看评论

相关 [java 多线程 并发] 推荐:

Java 多线程 (并发)总结

- - CSDN博客推荐文章
《进程与线程的一个简单解释》 简单摘要如下. 电力有限,一次只能供给一个车间使用. 进程的内存是共享的,每个线程都能使用. 一个线程使用内存空间时,其他线程必须等它结束. 车间厕所,有人时其他人不能进入. 某内存空间,仅供固定数目线程使用. 挂N把锁,进入的人拿钥匙锁上,出来时放回. (1)Runnable接口  (通常选择这种,接口本身可以实现多重继承,比较灵活).

JAVA多线程和并发基础面试问答

- - 企业架构 - ITeye博客
原文链接    译文连接  作者:Pankaj   译者: 郑旭东   校对:方腾飞. 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一. 在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题. ( 校对注:非常赞同这个观点).

Java Thread多线程

- - CSDN博客推荐文章
Java Thread多线程. Java 多线程例子1 小例子. super("zhuyong");//设置线程的名字,默认为“TestThread”. Java 多线程例子2 前台线程(用户线程) 后台线程(守护线程 ). 1,setDaemon(true)后就是后台线程(守护线程 ),反之就是前台线程(用户线程).

Java多线程之synchronized

- - CSDN博客推荐文章
这里通过三个测试类阐述了synchronized应用的不同场景. 首先是最基本的synchronized Method的使用.  * @see 概述:Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor) .  * @see 说明:当synchronized关键字修饰一个方法时,则该方法为同步方法 .

java多线程总结

- - Java - 编程语言 - ITeye博客
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是:. class 类名 extends Thread{. * @author Rollen-Holt 继承Thread类,直接调用run方法.             System.out.println(name + "运行     " + i);.

Java多线程学习

- - CSDN博客编程语言推荐文章
  线程是一种轻量级的进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单. 即多个线程可以同时执行,就像有多条流水线一样,可以同时进行工作,是并发执行的.   程序是由进程组成的,进程是由线程组成的.

Java多线程(二)同步

- - CSDN博客编程语言推荐文章
如果你的java基础较弱,或者不大了解java多线程请先看这篇文章 java多线程(一)线程定义、状态和属性. 同步一直是java多线程的难点,在我们做android开发时也很少应用,但这并不是我们不熟悉同步的理由. 希望这篇文章能使更多的人能够了解并且应用java的同步. 在多线程的应用中,两个或者两个以上的线程需要共享对同一个数据的存取.

[Java] Java 多线程案例分析

- - V2EX
现要从 hbase中导出 2016 年整年的,大约 10w只股票行情数据,数据总量约 100t. 汇总到 hdfs中供需求方使用. 已知数据量规模大概是 100t,那么单台机器处理肯定不是不行的,先不说大多数磁盘都没这么大,即便磁盘有这么大,单台机器处理对于内存和 cpu 要求也很高,所以我们将问题一般化,使用数量有限的低配机器.

Java 多线程内存模型

- - ITeye博客
Java 多线程内存模型.       Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果. 在此之前,主流程序怨言(如C/C++等)直接使用物理硬件(或者说操作系统的内存模型),因此,会由于不同的平台上内存模型差异,导致程序在一套平台上并发完成正常,而在另一套平台上并发访问却经常出错,因此经常需要针对不同的平台来编写程序.