美文网首页
Java多线程--线程常用方法

Java多线程--线程常用方法

作者: 轻轻敲醒沉睡的心灵 | 来源:发表于2021-04-28 18:07 被阅读0次

    当使用多线程时,和业务系统结合,有时需要适当的调用线程一些方法,做一些调控。下面介绍一些常用方法及场景。

    1. start()

    线程启动方法,一般创建新线程后直接调用启动新线程。

    2. join()

    很多情况下,在主线程中起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束。但是如果主线程的业务需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再进行,这个时候就要用到join()方法了。
    这个时候,主线程join()方法后面的代码要等到子线程结束了才会继续执行。

    Thread t = new Thread();
    t.start(); 
    t.join();
    System.out.println(123);
    

    3. sleep(long millis)

    millis参数设定睡眠的时间,以毫秒为单位。线程睡眠,使线程转到阻塞状态,睡眠期间会让出CPU的执行权,去执行其它线程,同时CPU也会监视睡眠的时间,当睡眠结束后,就转为就绪(Runnable)状态。因sleep()是Thread类的Static(静态)方法,所以线程虽然休眠了,但是对象的锁并木有被释放。

    4. yield()

    yield()是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
    注意:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

    5. interrupt()

    唤醒正在睡眠的程序,调用interrupt()方法,会使得sleep()方法抛出InterruptedException异常,当sleep()方法抛出异常就中断了sleep的方法,从而让程序继续运行下去

    6. wait()notify()(notifyAll())

    wait()notify()notifyAll()方法是Object类的final native方法,这些方法不能被子类重写。另外它们必须要与synchronized(Obj)一起使用,也就是waitnotify是针对已经获取了Obj锁进行操作,从语法角度来说就是wait(),notify()必须在synchronized(Obj){...}语句块内。

    • wait(): 就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。
    • notify(): 就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。
    • notifyAll(): 唤醒所有的wait对象
      wait和notify使用例子的详细讲解,参考廖雪峰老师网站

    wait和notify例子:https://www.liaoxuefeng.com/wiki/1252599548343744/1306580911915042


    注意:sleep与wait的区别

    • sleep在Thread类中,wait在Object类中(synchronized(Obj){...}语句块内)
    • sleep不会释放锁,wait会释放锁
    • sleep使用interrupt()来唤醒,wait需要notify或者notifyAll来通知

    相关文章

      网友评论

          本文标题:Java多线程--线程常用方法

          本文链接:https://www.haomeiwen.com/subject/fiywrltx.html