线程的优先级:
getPriority( ):获取线程的优先权
setPriority(int p):设置线程的优先权
高优先级的线程要抢占低优先级线程的cpu执行权,但是从概率上讲,高优先级的线程高概率被执行的情况并不意味着只有当高优先级的线程执行完以后,低优先级的线程才执行。
线程的五种状态:
新建、就绪、运行、阻塞、死亡
在Java中,我们通过同步机制,来解决线程的安全问题
方式一:同步代码块(处理实现Runnable的线程安全问题)
synchronized( 同步监视器 ){
//需要被同步的代码
}
操作共享数据的代码,即为需要被同步的代码
共享数据:多个线程共同操作的变量
同步监视器,俗称:锁。任何一个类的对象都可以充当锁。要求:多个线程必须要共用同一把锁。
补充:在实现Runnable接口创建多线程的方式中,我们可以考虑使用this充当同步监视器
方式二:同步方法
如果操作共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明为同步的
同步方法仍然涉及到同步监视器,只是不需要我们显示的声明
非静态的同步方法的同步监视器是:this
静态的同步方法的同步监视器是:类本身(类名 . class)
同步的方式,解决了线程的安全问题。----->好处
操作同步代码时,只有一个线程参与,其他线程必须等待。相当于一个单线程的过程,效率低。---->局限性
synchroized和lock的不同?
synchroized机制在执行完相应的同步代码后,自动的释放同步监视器
lock需要手动启动同步(lock()),结束同步也需要手动的实现(unlock())
线程通信的三个方法:
wait():当前线程进入阻塞状态,并释放同步监视器
notify():唤醒被wait()的一个线程,如有多个线程被wait(),则唤醒优先级高的线程
notifyAll():唤醒所有被wait()的线程
以上三种方法只能在同步代码块或同步方法中使用并且都定义在java.lang.Object类中
wait()和sleep()的异同?
相同点:都可以使得当前进程进入阻塞状态
不同点:声明位置不同,Thread类中声明sleep(),Object类中声明wait()
调用要求不同,sleep()可以在任何场景下调用,wait()必须使用在同步代码块或同步方法中
关于是否释放同步监视器,sleep()不会释放锁,wait()会释放锁