java多线程(相关方法讲解)
来源:互联网 发布:qt多线程编程实例 编辑:程序博客网 时间:2024/05/22 09:52
首先线程分为几个状态
1,新创建,2,可运行(非立即运行,等待系统调度)3,等待(等待其他线程)4,阻塞(等待获取对象锁)5,死亡
wait (),使获取对象锁的线程,放弃当前锁,进入阻塞状态。。后续--
wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
sleep()方法和yield()方法都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,把运行机会让给别的线程。两者的区别在于:
sleep()方法会给其他线程运行的机会,不考虑其他线程的优先级,因此会给较低优先级线程一个运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。
当线程执行了sleep(long millis)方法,将转到阻塞状态,参数millis指定睡眠时间;当线程执行了yield()方法,将转到就绪状态。
sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常。
sleep()方法比yield()方法具有更好的可移植性。不能依靠yield()方法来提高程序的并发性能。对于大多数程序员来说,yield()方法的唯一用途是在测试期间人为地提高程序的并发性能,以帮助发现一些隐藏的错误。本章及第20章为了使得程序能增加出现预期运行效果的可能性,在一些例子中使用了yield()方法,这只是出于演示的需要,但在实际应用中不值得效仿。
yield 两者都能释放对CPU的使用权,但是在同步域中不表示释放同步域!
为什么wait(),notify()方法要和synchronized一起使用?
因为wait()方法是通知当前线程等待并释放对象锁,notify()方法是通知等待此对象锁的线程重新获得对象锁,然而,如果没有获得对象锁,wait方法和notify方法都是没有意义的,即必须先获得对象锁,才能对对象锁进行操作,于是,才必须把notify和wait方法写到synchronized方法或是synchronized代码块中了。
yeild()方法,使当前线程离开运行状态,进入可运行状态,(一般效果不大),使得有相同优先级的线程有机会执行
join()方法,使当前线程B,追加到线程A后面,直至A执行完之后,才会进入可运行状态。
1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了这个对象后,线程就进入了初始状态;
2、当该对象调用了start()方法,就进入可运行状态;
3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;
4、进入运行状态后情况就比较复杂了
4.1、run()方法或main()方法结束后,线程就进入终止状态;
4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;
4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;
4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;
4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。
- java多线程(相关方法讲解)
- Path相关方法讲解
- java多线程同步方式(无讲解)
- Java程序员多线程讲解
- Java 多线程讲解
- Java多线程讲解笔记
- Java 多线程讲解
- Java多线程例子讲解
- Java多线程详细讲解
- Java多线程编程讲解
- Java多线程(6)——Thread类中的一些方法(传智播客毕老师视频讲解)
- Java多线程中join方法的理解(对Thread.join讲解的很详细)
- java多线程(14)--线程池作用及Executors方法讲解
- Path相关方法讲解(一)
- Path相关方法讲解(二)
- Java 多线程实例讲解综述
- Android 与java 多线程讲解
- Java 并发 (多线程) 讲解<一>
- 大小写互换
- 关于之前发表的des遇到的问题的新的解决方案
- 互联网协议入门(一)
- 【Machine Learning notes(机器学习笔记-001)】
- SQlite数据库(3)---API操作
- java多线程(相关方法讲解)
- Fragment学习理解及简单实践
- js的变量、参数
- CodeM美团点评编程大赛 音乐研究
- 计算机字符编码详解
- stepbystep记录在30岁转型IT的自学之路
- KMP算法
- 网络的两个性能指标:速率与带宽
- PMP模拟试题与解析(七)