黑马程序员_基础学习笔记(8)
来源:互联网 发布:linux环境变量格式 编辑:程序博客网 时间:2024/06/05 17:38
---------------------- android培训、java培训、期待与您交流! ----------------------
黑马程序员---比向东---第十一天
多线程:
进程:是一个正在执行中的程序。
每一个进程执行都有一个执行顺序,该顺序是一个执行路径,
或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。
线程在控制着进程的执行。
一个进程中至少有一个线程。
start()方法的作用:1,启动线程 2,调用run()方法
多线程特点:随机性,谁抢到谁执行,至于执行多长时间由cpu说了算。
原因是多个线程都获取cpu的执行权,cpu执行到谁,谁就运行。
注:在某一个时刻,只能有一个程序在运行(多核除外)
可以理解为多线程的运行行为时在互相抢夺cpu的执行权。
为什么要覆盖run方法?
THread类用于描述线程。该类就定义了一个功能,用于存储线程
的运行代码,该存储功能就是run方法。也就是说thread类中的
run方法是用于存储线程要运行的代码。所以复写run方法就是将
自定义的代码存储在run方法中,让线程运行。
Runnable接口
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法
将线程要运行的代码存放在run方法中。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Ttread类的构造函数
为什么要将Runnable接口的子类对象传递给thread的构造函数?
因为,自定义的run方法所属的对象是Runnable接口的子类对象,
所以要让线程去指定指定对象的run方法,就必须明确该run方法所属的对象。
而thread类的构造方法之一是 Thread(Runnable r){}
5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
实现方式和继承方式的区别
实现方式的好处:避免了单继承的局限性。推荐使用实现方式。
继承方式线程代码存放在Thread子类run方法中,而实现方法存放在
就扣的子类run方法中。
多线程的安全问题
问题原因
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了
一部分。还没有执行完,另一个线程参与进来执行,导致了共享数据的错误
解决办法
对多条操作共享数据的的语句,只能让一个线程都执行完,在执行过程中
其他线程不可以参与执行。
java对于多线程的安全问题提供了专业的解决方式
就是同步代码块
synchronized(对象)
{
需要被同步的代码
}对象如同锁,持有锁的线程可以在同步中执行。没有持有锁的线程
即使获取cpu的执行权,也进不去,因为没有获取锁。
同步的前提
1 必须要有两个或者两个以上的线程
2 必须是多个线程使用同一个锁
3 必须保证同步代码中只有一个线程在执行
好处:解决了多线程的安全问题。
弊端:耗费内存资源,每次进锁都要判断!也耗费时间
如何判断多线程程序中有安全问题的代码?
1 明确哪些代码是多线程运行代码
2 明确共享数据
3 明确多线程运行代码中哪些操语句是操作共享数据的。
多线程死锁参考 13 14 15讲
黑马程序员---比向东---第十二天
线程通信
其实就是多个线程在操作同一个资源。但是操作的动作不同。
等待唤醒机制:两个或多个线程操作同一共享数据。
wait () sleep() notify() notifyAll()
wait() 释放资源,释放锁。
sleep() 释放资源,不释放锁。
notify() 唤醒最先wait的线程。
notifyAll()唤醒所有wait的线程。
都是用在同步中,因为要对持有监视器(锁)的线程操作
所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义在object类中呢?
因为这些方法在操作同步线程时,都必须要标示它们所操作线程持有的锁
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒
不可以对不同锁中的线程唤醒。
也就是说,等待和唤醒必须是同一个锁。
而锁可以是任意对象,锁可以被任意对象调用的方法定义在object类中
参考代码 InputOutputDemo12_3 ProducerConsumerDemo12_5
join:
当a线程执行到了b线程的join方法时,那么a线程就会等待,等b线程都执行完
a才会执行。join可以用来临时加入线程执行。
优先级
所有线程默认优先级都是5 1<=优先级<=10 MIN_PRIORTY MORM_PRIORTYMAX_PRIORTY
setPriority(int);设置优先级
stop方法已经过时
所以停止线程只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只要控制住循环,就可以让run方法结束,即线程结束
特殊情况
当线程处于冻结状态。就不会读取到标记,线程就不会结束
当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。
强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束
Thread类提供方法 interrupt();
点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 <a href="target=" _xhe_href="target=" blank"="">java培训、期待与您交流!">点击打开链接 点击打开链接 点击打开链接 点击打开链接 <a href="target=" _xhe_href="target=" blank"="">http://edu.csdn.net/heima">点击打开链接
- 黑马程序员_基础学习笔记(8)
- 黑马程序员_基础学习笔记(1)
- 黑马程序员_基础学习笔记(2)
- 黑马程序员_基础学习笔记(3)
- 黑马程序员_基础学习笔记(4)
- 黑马程序员_基础学习笔记(5)
- 黑马程序员_基础学习笔记(6)
- 黑马程序员_基础学习笔记(7)
- 黑马程序员_基础学习笔记(9)
- 黑马程序员_基础学习笔记(10)
- 黑马程序员_基础学习笔记(11)
- 黑马程序员_基础学习笔记(12)
- 黑马程序员_基础学习笔记(13)
- 黑马程序员_基础学习笔记(14)
- 黑马程序员_基础学习笔记(15)
- 黑马程序员_基础学习笔记(16)
- 黑马程序员_学习笔记_Java基础_多态
- 黑马程序员_学习笔记_Java基础_网络编程
- spring AOP 事务 与 Afterthrowing 冲突的解决办法
- LFS 笔记
- mediaplayer实现音乐播放
- 音乐播放功能
- POWERSHELL的一个函数
- 黑马程序员_基础学习笔记(8)
- 一个十进制整数转换成二进制含多少个1
- 黑马程序员_基础学习笔记(9)
- 数据透视表的VLOOKUP模糊查找
- 黑马程序员_基础学习笔记(10)
- 黑马程序员_基础学习笔记(11)
- 关于在C++中调用system函数
- 位操作之一
- 黑马程序员_JavaIO输入与输出上