1.线程的常用方法:
1.获取当前正在执行的线程对象, static方法
|
2. 返回该线程的名称
getName() |
3. 让线程睡眠多久, 释放CPU资源, 抛出InterruptedException, 被打断异常
static void |
sleep(long millis) 以毫秒作为单位 |
4.判断线程是否处于活动状态
boolean |
isAlive() |
5.线程优先级
优先级:可以给线程设置优先级,范围是1-10,10优先级最高
setPriority(数字):给线程设置优先级,这里优先级高,并不代表一定先执行,只是增加了抢占到资源的机会
getPriority():获取线程的优先级,
Thread提供了三个优先级常量:
Thread.MAX_PRIORITY=10
NORM_PRIORITY = 5
MIN_PRIORITY = 1
Main方法的优先级,是5
6.yeild() 礼让, A线程正在执行, 调用yeild(), 退出CPU资源, 然后与其他线程竞争CPU资源
7.join() 线程A中, 启动线程B, 线程B调用join(), 让线程A等线程B执行完,线程A才执行
2.在外部线程终止
第一种方式:
设置一个boolean的属性, 提供公开的set属性名(), 在线程外,调用set属性方法,设置为false, 终止线程
第二种:
在线程外部,调用interrupt() 给线程发送了一个打断的信号, 线程的run中使用isInterrupted()来判断该线程是否被打断过
第三种方式:
在线程外部,调用interrupt() 给线程发送了一个打断的信号, 并且抛出一个InterruptedException, 可以在run()方法捕获这个异常, 需要让线程sleep()
两个人同时取钱:
两个线程对象: name 取钱
账号对象: 余额 取钱
隐藏问题:
因为多个线程同时访问同一个数据,(共享数据), 出现数据中间状态值(修改)丢失,解决方案,给共享数据加锁,
Synchronized: 同步
- 在方法上使用Synchronized, 该方法叫做 同步方法, 锁是在加载this
- 使用同步代码块
同步代码块与同步方法的区别:
- 同步代码块的加锁的对象可以任意 Synchronized(加锁对象)
- 同步方法是对同步方法所在类的对象加锁, 给this加锁
面试题: 一个类有多个同步方法, 某个线程正在执行该类的同步方法, 其他线程不能执行该类的同步方法, 因为获取不到this的锁, 但是可以执行非同步方法
缺点: 效率低, 容易造成死锁