Java 多线程 (并发)总结
一、概念
  1. 维基百科解释
 
  进程是什么?
 
  线程是什么?
 
  2. 一个巧妙的比喻
 
   《进程与线程的一个简单解释》 简单摘要如下
  
| 计算机概念 | 类比 | 
| CPU | 一座工厂 | 
| 单CPU一次执行一个任务 | 电力有限,一次只能供给一个车间使用 | 
| 进程 | 工厂的车间 | 
| 线程 | 车间里面的工人 | 
| 线程并发 | 一个车间很多工人 | 
| 进程的内存是共享的,每个线程都能使用 | 车间弓箭是工人们共享 | 
| 一个线程使用内存空间时,其他线程必须等它结束 | 车间厕所,有人时其他人不能进入 | 
| “互斥锁” | 厕所上加个锁,进入时锁上 | 
| 某内存空间,仅供固定数目线程使用 | 厨房可以同时容纳多个人 | 
| “信号量” | 挂N把锁,进入的人拿钥匙锁上,出来时放回 | 
二、创建多线程,方法
  (1)Runnable接口  (通常选择这种,接口本身可以实现多重继承,比较灵活)
 
       
  1.子类,实现Runnable接口
2.子类要覆写Thread类中的run方法
3.子类引用对象,Thread t1 = new Thread(d1); 必须声明为Thread类型
4.使用start()方法,启动多线程
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()没有使用多线程
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从句中释放。
相同的是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]:概述
  
 
 
七、线程池
为什么要用线程池:
- 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
- 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)
  聊聊并发(三)——JAVA线程池的分析和使用
  
 
 
  Java 线程池学习
  
 
 
八、JDK 线程工具
  Executors
 
  Callable/Future
 
  Lock/Condition
 
  Semaphore 信号灯
 
  CyclicBarrier
 
  CountDownLatch
 
  Exhanger
 
  集合
 
 
 
 
posted on 2013-12-09 12:47 love so much 阅读(233) 评论(0) 收藏 举报
 
                    
                     
                    
                 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号 
