黑马程序员——多线程
来源:互联网 发布:linux tcp ip 转发 编辑:程序博客网 时间:2024/06/06 02:23
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、线程基本介绍
1.线程和进程的区别
(1)进程是系统进行资源分配和调度的一个独立单位
(2)线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位
(3)进程有独立的地址空间
(4)同一个进程中的线程没有独立的地址空间,它们共享地址空间;线程也有自己的堆栈和局部变量
2. 线程的调度和优先级问题
A:线程的调度 a:分时调度 b:抢占式调度 (Java采用的是该调度方式) B:获取和设置线程优先级 a:默认是5 b:范围是1-10
3.线程创建方法
(1)继承Thread类,实现run方法
public class SubThread extends Thread{ public void run(){ for(int x = 0 ; x<100 ; x++){ System.out.println("run..."+x); } }}
(2)实现runnable接口,并用其初始化Thread对象
/定义类,实现Runnable接口,重写run方法class TicketRunnable implements Runnable{ public void run(){ for(int x = 0 ; x<100 ; x++){ System.out.println("run..."+x); } } }public class ThreadDemo { public static void main(String[] args) { //创建Thread类对象,传递Runnable接口的实现类的对象 TicketRunnable t = new TicketRunnable(); Thread t0 = new Thread(t); }}
4.Thread的主要方法
(1)run
(2)start:线程开始运行
(3)join:调用线程执行x.join(),表示调用线程等待x线程执行完
(4)sleep:当前线程休眠
(5)yield:当前线程出让CPU
(6)isInterrupted:是否处于中断状态
(7)interrupt:设置线程的中断状态
(8)interrupted:清除线程的中断状态
(9)setDeamon:设置是否守护线程
(10)setPriority:设置优先级
5.线程的生命周期
A:新建 B:就绪 C:运行 D:阻塞 E:死亡
二、线程安全
(1)类的线程安全性:如果一个类在多线程的访问下,其状态是可以预测的,并且不需要额外的同步,那么这个类就是线程安全的类
(2)封装:封装限制了代码路径,使得线程安全更有可能
(3)组合:非线程安全类–>线程安全类;线程安全类–>非线程安全类
三、synchronized
(1)synchronized是Java的关键字,是线程同步的内部机制,简单、方便,但性能不高
(2)可用于方法声明,方法体内,静态初始化块等;synchronized若用于代码块,加锁的对象可以是普通的Object或XXX.class
(3)synchronized保证了线程的可见性和互斥性
(4)可见性:一个线程的执行结果可以被另一个线程所看到
(5)互斥性:在同一时间只能有一个线程进行被保护的代码块
同步解决线程安全问题
A:同步代码块
synchronized(对象) {
需要被同步的代码;
}
这里的锁对象可以是任意对象。
B:同步方法
把同步加在方法上。
这里的锁对象是this
C:静态同步方法
把同步加在方法上。
四、wait、notify、notifyAll
(1)是Object类的方法
(2)是Java内部的条件阻塞机制
(3)条件阻塞机制的三要素:锁、条件、等待队列
(4)wait使调用线程阻塞,并等待其他线程的唤醒或是中断、超时
(5)notify在等待队列中选择一个线程使之运行(线程饿死)
(6)notifyAll激活等待队列中所有的线程,并且只能有一个线程能运行成功,其余仍等待
(7)逻辑:
synchronized(lock) { //锁if (xxxxxx) { //条件lock.wait(); //等待队列} else {doLogic();}}synchronized(lock) { //锁doLogic();if (xxxxxx) { //条件lock.notifyAll(); //等待队列}}
五、interrupt、interrupted
(1)interrupt设置线程状态为中断状态
(2)interrupted清除线程的中断状态,返回清除前的值
(3)wait,join,sleep以及J.U.C中一些类如ArrayBlockingQueue支持中断,并且在中断时都抛出InterruptedException,并且清除中断状态
(4)要指出的是:不是因为在其他线程中调用了x.interrupt(),x线程执行中就一定会抛出异常;抛出的InterruptedException是因为,wait、sleep等方法在循环中检查了线程状态,当被设置为中断后,就会抛出异常,并清除中断状态
(5)线程InterruptedException的处理方法:
a)简单地抛到调用者,由调用者处理
b)保存中断状态(Thread.currentThread().interrupt()),由上层代码处理(如:线程池中某一线程的任务被用户取消)
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 第三章第46题
- 黑马程序员-OC学习笔记-点方法、成员变量作用域以及set方法和get方法@property的综合题
- 面试题杂货铺 ( 一)
- 通过讲故事,让你明白比特币的原理及运作机制
- Ubuntu14.04+Jekyll+Github Pages搭建静态博客
- 黑马程序员——多线程
- Codeforces Round #305 (Div. 1) C(容斥原理)
- 第一章第三题
- win8下JLink V7 V8修复教程
- Thinking in Java 第三章
- Java线程安全和非线程安全
- C51中遇到一个有关data与xdata的问题,已解决
- 使用WebSocket构建实时Web应用
- maven的安装方法