多线程基础-常用线程方法(三)

1.notify和wait方法

为什么notify,wait方法在Object中?

Monitor内置于每一个Object对象中,是一个同步工具,相当于操作系统中的互斥量,即值为1 的信号量。也可以称作是对象的同步锁。

notify(), wait()依赖于“同步锁”,并且每个对象有且仅有一个!这就是为什么notify(), wait()等函数定义在Object类,而不是Thread类中的原因。

Object类中关于等待/唤醒的API详细信息:
  • notify() – 唤醒在此对象监视器上等待的单个线程。
  • notifyAll() – 唤醒在此对象监视器上等待的所有线程。
  • wait() – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。
  • wait(long timeout) – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
  • wait(long timeout, int nanos) – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量”,当前线程被唤醒进入“就绪状态”。

    需要注意的地方是,如果在一个地方用了某个对象的wait方法,必须要在另一个线程中使用notify来把它唤醒。

2.线程让步方法yield

1) wait()是让线程由“运行状态”进入到“等待(阻塞)状态”,而yield()是让线程由“运行状态”进入到“就绪状态”。

2) wait()是会线程释放它所持有对象的同步锁,而yield()方法不会释放锁。

3)yield()虽然可以让线程由“运行状态”进入就绪状态,但是不一定会让其他线程获取cpu的执行权。

3.线程休眠方法Sleep

sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

wait()会释放对象的同步锁,而sleep()则不会释放锁。

4.join方法

join() 定义在Thread.java中
join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行

join方法和wait方法的区别是唤醒的方式不同,wait通常要notify唤醒,join要等待调用join函数的线程对象执行完线程之后执行。

5.线程终止方法Interrupt

Thread.interrupt()方法不会中断一个正在运行的线程。它的作用是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

6.线程优先级和守护线程

java 中的线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行。

用户线程执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务。需要注意的是:Java虚拟机在“用户线程”都结束后会后退出。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值