一、概念

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
集合





Java 多线程 (并发)总结的更多相关文章

  1. Java多线程-并发容器

    Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...

  2. Java 多线程并发编程一览笔录

    Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...

  3. Java多线程并发技术

    Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/a ...

  4. java 多线程并发问题总结

    java 多线程并发主要通过关键字synchronized实现 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问 ...

  5. 从火箭发场景来学习Java多线程并发闭锁对象

    从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size—这种方式来实现.但是在多线程并发的情 ...

  6. Java多线程并发03——在Java中线程是如何调度的

    在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...

  7. Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗

    在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...

  8. Java多线程并发05——那么多的锁你都了解了吗

    在多线程或高并发情境中,经常会为了保证数据一致性,而引入锁机制,本文将为各位带来有关锁的基本概念讲解.关注我的公众号「Java面典」了解更多 Java 相关知识点. 根据锁的各种特性,可将锁分为以下几 ...

  9. Java多线程并发04——合理使用线程池

    在此之前,我们已经了解了关于线程的基本知识,今天将为各位带来,线程池这一技术.关注我的公众号「Java面典」了解更多 Java 相关知识点. 为什么使用线程池?线程池做的工作主要是控制运行的线程的数量 ...

  10. Java多线程并发07——锁在Java中的实现

    上一篇文章中,我们已经介绍过了各种锁,让各位对锁有了一定的了解.接下来将为各位介绍锁在Java中的实现.关注我的公众号「Java面典」了解更多 Java 相关知识点. 在 Java 中主要通过使用sy ...

随机推荐

  1. 已知的CPropertysheet bug: 切换焦点导致无响应

    当一个页面内容比较多时我们首先可能考虑用Tab Control,但如果有很多页面内容需要动态加载则用CPropertySheet比较好点~ CPropertySheet有两种不同的显示模式.一种就是向 ...

  2. 一步一步重写 CodeIgniter 框架 (7) —— Controller执行时将 Model获得的数据传入View中,实现MVC

    1. 实现过程 1) 上一节讲述了 View 视图的加载过程,它是在 Loader 类中加载的,并通过 Include 语句进行包含.那么为了在 View 中传递变量,只需要在 include 语句所 ...

  3. MySQL分组数据

    分组 理解分组能够看例如以下一个样例,首先我们打印出products表例如以下 从上面的表中能够看出.每一个vendor都有若干个产品,那么怎么一次统计每一个vendor有多少个产品呢? 这里就能够使 ...

  4. oracle scn浅析

    1. 系统SCN号 查询系统SCN号的方法: select dbms_flashback.get_system_change_number from dual commit后系统SCN号会增长,但是即 ...

  5. java--内部类访问final成员

    局部类只能访问外包方法中的final成员.位于方法内部的局部类,可以访问局部类之外,外包方法之内的所以变量和方法,但是生命周期不同,延长生命周期的办法就是将变量设置为final类型. 1)从程序设计语 ...

  6. 求 n! (大数问题)----------HDOJ1042

    以下只YY算法,c++实现,java大神绕道..... (1)位数的估计     显然对于大数(比如1000的阶乘)的阶乘我们找不到一个数据类型存放这个数,是在太大啦....     那么现在来估计一 ...

  7. CF 319C(Kalila and Dimna in the Logging Industry-斜率DP,注意叉积LL溢出)

    C. Kalila and Dimna in the Logging Industry time limit per test 2 seconds memory limit per test 256 ...

  8. 基于mAppWidget实现手绘地图--索引&DEMO

    文章翻译完了,梳理一下,附Demo下载 基于mAppWidget实现手绘地图(一)–简介 基于mAppWidget实现手绘地图(二)–概要 基于mAppWidget实现手绘地图(三)–环境搭建 基于m ...

  9. springmvc + jquery easyui实现分页显示

    如有不明确的地方,戏迎增加QQ群交流:66728073      推荐一本Java学习的书:深入理解Java7 一,下载并导入jquery easyui的导 <link rel="st ...

  10. Google C++ style guide——命名约定

    1.通过命名规则 函数命名.变量命名.文件命名应具有描写叙述性. 类型和变量应该是名词,函数名能够用"命令性"动词. 2.文件命名 文件名称所有小写,能够包括下划线(_)或者断线( ...