用到的代码后面会添加上去,如果急需要的话,评论留下邮箱
线程优先级
(1)每个线程都有优先级,优先级越高,获得CPU资源的机会越大,只是机会变大了,不是一定就能获取到
(2)线程优先级范围:1-10
(3)主线程默认优先级:5
(4)自定义线程:默认优先级:自定义的线程优先级跟启动这个线程的一样
(5)设置 & 获取优先级方法
public final void setPriority(int newPriority)
public final int getPriority()
用户线程与守护线程
(1)用户线程
主线程默认:用户线程,不能修改其为守护线程
(2)守护线程
- 每个线程都可以设置为守护线程,也可以设置为不是守护线程
- 特点:
①守护线程可以看做是用户线程保姆,是为用户线程服务的
②自定义线程是否是守护线程和启动它的线程默认一样
③所有用户线程都挂了,守护线程就没有必要工作了,就会死亡,当然不一定立即死亡,有可能要处理后事。 - 注意:要修改其是否是守护线程,不能在就绪状态及其以后的状态修改
- 设置 & 判断是否是守护线程 方法
public final void setDaemon(boolean on)
public final boolean isDaemon()
线程同步
(1)为什么要线程同步?
多线程环境下,多个线程对象访问一个数据会出现线程安全问题
案例:卖票
出现了重复的票和负数的票
(2)线程同步方式
- 同步代码块
-
一块代码{}只能一个线程执行完毕后,其他线程才能跑。
语法:synchronize(同步监听对象){
需要被同步的代码(有线程安全问题的代码)
} -
同步监听对象:
①相关线程之间一定要保证同步监听对象是同一个
②静态同步代码块默认的监听对象是this
③类名.class:字节码对象,有且只有一份
- 继承Thread
(1)同步监听对象只能使用类名.class
(2)如果是使用的一个对象也可以是this——案例:存钱-取钱-存钱-取钱 - 实现Runnable接口
可以是this, newObject()…, 类名.class
2、同步方法
语法:
在方法签名中的返回值之前加入synchronized,例:
synchronized private static void main(param){
}
监听对象:
①同步方法不需要写同步监听对象,实例方法(非static修饰)默认同步监听对象是this;
②同步方法不需要写同步监听对象,静态方法(有static修饰)默认同步监听对象是当前类所在的字节码对象 Xxx.class;
注意事项:
①继承模式下某方法又调用自己类成员方法,不能使用同步方法
②实现模式下,直接加synchronized就可以了
- 锁机制
ReentrantLock
线程通信
主要两个方法:
(1)wait() 等待
(2)notify() 唤醒该同步监听对象上面线程