• [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

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    http协议学习系列
    git常用命令大全
    git常用命令与常见面试题总结
    MyBatis框架及原理分析
    Mybatis常见面试题总结
    java实现克隆的三种(很最全面)
    java中equals和==之间的区别?clone方法的作用,及其为什么要使用clone方法?如何使用clone复制对象?以及深克隆浅克隆
    ThreadLocal的简单使用及实现的原理
    Java 最常见的 208 道面试题
    TCP流量控制
  • 原文地址:https://www.cnblogs.com/jqmtony/p/3709711.html
Copyright © 2020-2023  润新知