java多线程知识点收集-总
1.线程与进程的关系
进程(Process):当一个程序进入内存开始运行时,就产生一个进程。进程是一个独立单元,它的资源由系统分配和调度。
线程(Thread):线程是进程的执行单元,线程在进程中是独立的、并发的执行流。当进程被初始化后,主线程(main)就被创建。
1)线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程。
2)线程拥有自己的堆栈、程序计数器以及局部变脸,但不拥有系统资源,它与父进程的其他线程共享共享父进程的全部资源。
3)线程的调度和管理由进程本身负责完成。
2.创建线程的方式
http://www.cnblogs.com/moonpool/p/5472549.html
有三种创建方法
1)继承Thread类--不能资源共享,当实现方便
Thread类是一个抽象类
2)实现Runnable接口--可以资源共享,在新建Thread对象时,需要Runnable接口实现类的对象作为target
Runnable是一个接口类
3)使用Callable和Future创建线程--有返回值的线程
Callable和Future都是接口类,FutureTask是Future的实现类
3.线程的生命周期(图片来自java疯狂讲义)
4.线程控制方法
http://www.cnblogs.com/moonpool/p/5494935.html
1)join--Thread中的方法,由使用线程的程序调用
--如果对象A在自己方法内使用对象B.join , 那么A的线程就会被阻塞,等到B线程死亡,A线程才能继续。
2)后台线程--Thread中的方法setDeamon(true)
--守护进程,当前台线程全部死亡后,后台线程也随之死亡
3)sleep--Thread类的静态方法
--在设置的时间内处于阻塞状态,时间一到,就变成就绪状态,等待被调用
4)yield与线程优先级--Thread类的静态方法
--使用了该方法后,当前线程就会变成就绪状态,操作系统就会在处于就绪状态的线程中,挑选优先级最高的线程,给它分配资源并允许。正常的线程都是普通优先级,优先级还有高级和低级,有相应的方法去设置。
5.线程同步方法
http://www.cnblogs.com/moonpool/p/5480593.html
1)同步代码块--在重写run()方法时使用synchronized修饰符修饰代码块
2)同步方法--在定义类时使用synchronized修饰符修饰修改方法
3)同步锁lock--lock和ReadWriteLock两个接口,对应的实现类是ReentrantLock以及ReentrantReadWriteLock
6.线程通讯方法
http://www.cnblogs.com/moonpool/p/5496887.html
1)如果采用的是同步代码块和同步方法的方式来实现线程的同步,就需要使用传统的线程通讯方式
在被线程调用方法(该方法被synchronized修饰)内添加wait ()、notify()以及notifyAll(),来阻塞调用线程或者通知其他线程运行。
wait ()、notify()以及notifyAll()这三个方法是由Object类提供
http://www.cnblogs.com/moonpool/p/5500845.html
2)如果采用的是同步锁方式来实现线程同步,就需要使用Condition控制线程通讯
和第一种类似,这里需要使用Condition对象在被线程调用方法(该方法不需要被synchronized修饰)内添加Lock.lock()、Condition.await ()、Condition.signal()、Condition.signalAll()以及Lock.unlock(),来实现线程通信
这里首先需要由lock对象的newCondition()方法返回一个Condition对象,await ()、signal()、signalAll()是Condition对象提供的方法
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100];
int putptr, takeptr, count; public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
} public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
http://www.cnblogs.com/moonpool/p/5503287.html
3)阻塞队列(BlockingQueue)
BlockingQueue是Queue的子接口,但主要用于线程同步
抛出异常 | 不同的返回值 | 阻塞线程 | 指定超时时间 | |
队尾插入元素 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
对头删除元素 | remove() | poll() | take() | poll(time,unit) |
获取、不删除元素 | element() | peek() | 无 | 无 |
----------------------------------------------------------------------------------------------
7.线程组
可以将线程分类管理,并设置优先级等
ThreadGroup类
由Thread类提供的构造方法来指定新建的线程属于哪个线程组。
8.线程池
存在的目的就是为了节省系统资源,将新建好的线程放入线程池,由线程池给线程分配资源并运行,当该线程销往后,给该线程分配的资源将会被回收回线程池。
由Executor工厂类提供的静态工厂方法来创建ExecutorService对象
9.线程相关类
ThreadLocal类 该类的成员变量在被线程调用时,将会产生一个副本,让线程可以随意维护自己拥有的变量副本,从而保证线程之前不会产生资源冲突,这和资源共享的同步方法由本质区别,使用场景也不一样。
线程安全的集合类 正常的集合类都是线程不安全的,这里线程安全的集合类就是可以被线程调用时产生一个副本,最终可以保证原集合的数据完整性。
思考:线程相关类的使用场景。
java多线程知识点收集-总的更多相关文章
- java 多线程知识点
线程状态图 说明: 线程共包括以下5种状态. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 就绪状态(Runnable) ...
- 【JAVA】JAVA相关知识点收集
下面这些链接都是我这段时间(7月-9月)看过的.感觉自己现在处于一个疯狂吸收知识的阶段,如果是文字的方式一点一点搬运到自己的博客既重复又费时间,只有等自己积累到一定程度后才能进行原创性高质量的产出吧. ...
- java多线程知识点
下面是我学习多线程记录的知识点,并没详细讲解每个知识点,只是将重要的知识点记录下来,有时间可以看看,如果有不对的地方,欢迎大家指出,谢谢! 1.多线程的状态和创建方式: 线程的状态: ...
- java多线程知识点汇总(一)多线程基础
1.什么叫多线程程序? 答:一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序. java编写的程序都是多线程的,因为最少有俩线程,main主线程和gc线程. ...
- 软帝学院:java多线程知识点分享
1.进程和线程: 进程:正在进行的程序.每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 线程:进程内部的一条执行路径或者一个控制单元. 两者的区别: 一个进程至少有一个线程 ...
- java——多线程知识点大总结
1:理解线程的概念之前,我们有必要先理解一下进程的概念 程序(Program)是为实现特定目标或解决特定问题而用计算机语言(比如Java语言)编写的命令序列的集合. 进程指一个程序的一次执行过程 ...
- java多线程知识点总结
1.线程调度知识:线程类Thread的了解,几个thread的方法.thread.sleep(),thread.join().(调用join方法的那个线程会立刻执行). object.wait()方法 ...
- java多线程知识点概述
这里只起一个概述的作用,极其简单的列一下知识点,需要在脑海中过一下,如果哪些方面不熟悉的话,建议利用网络资源去学习. 1.线程.进程概念 概念 线程状态及其转换 2.死锁.预防.解决 3.jdk线程实 ...
- java多线程知识点汇总(四)多线程知识点脉络图
1.多线程安全问题 1)synchronized关键字:如何加锁的问题,选择synchronized方法还是synchnized代码块. 选择哪个锁问题,this对象,还是class对象(针对stat ...
随机推荐
- 搭建mongoDB 配置副本集 replSet
mongodb的master_slave和ReplSet是很常见的两种构架: 下面记录下搭建mongodbReplSet 的过程: 首先,进入到一个指定目录下 >cd /opt 下载mongod ...
- ASP.NET车辆管理系统100%源代码
系统开发环境为VS2010.採用ASP.NET框架.数据库採用SQL Server.系统採用Ajax,具有:GPS导航(实时监控报警).申请审核.流程查看及短信息发送等功能.这个系统界面和功能是我认为 ...
- CF 445A(DZY Loves Chessboard-BW填充)
A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input stand ...
- 九度OJ 1139:最大子矩阵 (矩阵运算、缓存)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1014 解决:376 题目描述: 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩 ...
- POJ2115 C Looooops ——模线性方程(扩展gcd)
题目链接:http://poj.org/problem?id=2115 C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- centos6.5 mysql 5.6修改root密码,以及创建用户并授权
mkdir -p mysql_home/{data,temp,undologs,logs} chown -R mysql:mysql /dbfiles/mysql_home mysql_install ...
- RAC环境下oracle实例启动问题:ora-01565,ora-17503
今天有现场因为突然听电,数据库服务器停了,需要我远程重启一下. 现场是RAC环境,oracle10.2.0.4. 登录后,startup,报错如下 根据报错,初步判断是共享数据文 ...
- python 快速排序 qsort
def qsort(arr, start, end): if start > end: return def partition(arr, start, end): pivot = arr[st ...
- 烂笔头——JAVA.String
人们说 Sting+ 的效率很低 String+的编译步骤是: new StringBuilder() new String.valueof() StringBuilder.<init> ...
- <VS>MFC程序显示命令行窗口
编写MFC程序时,想打印出调试信息,使用cout后,发现程序并没有像想象中那样自动弹出命令行窗口,要输出的信息也没地方去查看.百度后知道要手动调出命令行窗口,才可以看到输出的信息. 百度上介绍了两 ...