• 线程五大状态,以及线程方法


    1.sleep() 方法

    让当前线程休眠指定的时间(毫秒)

    让出cpu执行权,但是并没有释放这个线程拿到的锁

     当前线程调用sleep方法,当前线程会进入阻塞态,在阻塞态中呆一段时间,就会进入就绪态

    2.yield() 方法

    使当前线程让出(释放)CPU执行时间片,与其他线程一起重新竞争CPU时间片。在一般情况下,优先级高的线程更有可能竞争到CPU时间片

    也就是说,yield()方法会让当前线程从运行态进入就绪态

    总结:

    sleep():会让线程从运行态进入到阻塞态(在阻塞态呆一段时间),然后再进入就绪态

    yield():会让线程直接从运行态进入到就绪态

    3.wait() 方法

    多个线程共用一把锁,哪个线程拿到锁了,在这个线程中使用obj.wait()方法,这个线程就是把锁释放出去,让其他被唤醒的线程抢这把锁,自己则进入等待队列中

    也就是说三个线程状态:拿到锁,可能获得锁的状态,等待队列(无法获得锁)

    1. Thread t1 = new Thread( () ->
    2. {
    3. synchronized (obj)
    4. {
    5. }
    6. });
    7. Thread t2 = new Thread( () ->
    8. {
    9. synchronized (obj)
    10. {
    11. }
    12. });
    13. Thread t3 = new Thread( () ->
    14. {
    15. synchronized (obj)
    16. {
    17. }
    18. });

    在哪个线程中调用obj.wait()方法,这个线程就让出锁,进入等待队列,直到其他线程中调用obj.notify()或者obj.notifyAll()方法,就可以竞争锁的占有权

    4.notify方法和notifyAll方法

    notify方法:唤醒在此对象监视器上等待的一个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的

    notifyAll方法:用于唤醒在监视器上等待的所有线程

    程序员甲和乙共用一块肥皂(锁),刚开始甲用了一会,然后调用了wait()方法,把肥皂交出去了,自己进入等待状态,乙拿到肥皂(锁)后,通过自己的notify()方法通知甲,告诉自己在用

    然后乙把锁交出去,自己又进入等待队列中.....

    5.join方法线程的join方法:thread.join()_Pr Young的博客-CSDN博客

    另外:

    如何让线程停止:

    不推荐使用JDK提供的stop(),destroy()方法,我们可以自己在线程类里面写一个stop方法

    可以看到在run方法里面,只有当flag为true的时候才执行方法体,进行打印输出

    本来是要执行1000次打印输出,但是执行到900次的时候,将调用我们写的线程的stop方法,将flag置为false,然后就不会再打印输出了

    1. public class Test implements Runnable
    2. {
    3. private boolean flag = true;
    4. @Override
    5. public void run()
    6. {
    7. int i = 0;
    8. while (flag == true)
    9. {
    10. System.out.println("Thread" + i);
    11. }
    12. }
    13. public void stop()
    14. {
    15. this.flag = false;
    16. }
    17. }
    18. //将下面两行代码合成一句代码:
    19. //Test temp=new Test();
    20. //Thread test=new Thread(temp);
    21. Thread test=new Thread(new Test());
    22. test.start();
    23. for(int i=0;i<1000;i++)
    24. {
    25. if(i==900)
    26. {
    27. test.stop();
    28. }
    29. }
  • 相关阅读:
    web3之女巫(sybil)
    配置禁止生成可执行文件-火绒法
    若依3.6.0使用Mybatis-plus分页失效以及完美替换Pagehelper
    Python+selenium+unittest+HTMLTestReportCN单元测试框架分享
    Docker初级篇
    S-3A5001 DPDK性能优化
    【fbtft】如何添加fbtft驱动
    Leecode 周赛318场
    Python期末复习题:流程控制
    5分钟搭建图片压缩应用
  • 原文地址:https://blog.csdn.net/weixin_47414034/article/details/126534686