多线程的部分总结
线程的常用方法
- yield释放当前cpu执行权(进入就绪状态)
- join:在线程1中调用线程2的join方法,线程1进入阻塞状态,直到线程2完全执行完之后,线程1才会结束阻塞状态(进入阻塞状态)
- sleep(long millitime)让当前线程进入阻塞状态
- getPriority 获取当前线程优先级
- setPriority(1-10)设置线程优先级
创建线程的几种方式?
1:继承thread类。重写run()方法,start开启线程
2:实现runnable接口,重写run()方法,执行线程传入runnable接口实现类,调用start方法
3:实现callable接口,,重写call()方法
线程的生命周期
创建状态:生成线程对象,并没有调用start方法。这时线程处于创建状态
就绪状态:调用了start方法之后,线程进入就绪状态,但此时线程调度程序还没有把该线程设置为当前线程,此时就处于就绪状态。当线程运行之后,从等待或睡眠中回来,也处于就绪状态
运行状态:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入运行状态,开始运行run函数
阻塞状态:线程正在运行时被暂停,通常是为了等待某个事件的发生之后在运行。sleep,suspend,wati等方法都可以导致线程阻塞
死亡状态:一个线程执行run之后或调用stop方法,该线程就会死亡。已死亡的线程无法使用start方法另其进入就绪状态
线程的生命周期?
创建、就绪、运行、阻塞、死亡
继承thread与实现runnable接口两种方式的比较
1:继承具有单继承性
2:runnable天然可以共享数据
结论:优先使用实现runnable接口的方式创建线程
解决线程安全的几种方式
- 同步代码块
格式:
synchronized(同步监视器){
}
- 同步方法
private static synchronized void methodName(){
}
同步方法扔然涉及同步监视器,只是不需要显示的声明,非静态的同步方法,监视器是:this,静态的同步方法,监视器是:当前类本身
- lock
实例化 ReentrantLock,调用lock(),最后调用unlock()
lock 与synchronized异同?
相同:都可以用来解决线程安全问题
不同:1:synchronized机制在执行完同步代码之后,自动释放同步监视器。lock需要手动的启动和结束同步
2:lock只有代码块锁,synchronized有代码块锁和方法锁
3:使用lock锁,jvm将花费较少的时间调度线程,性能更好。并且具有更好的扩展性

浙公网安备 33010602011771号