• 学习java的第二十九天。。。(多线程)


    今天是学习java的第二十九天,今天学习了多线程

    线程的状态

    线程调度

    线程调度指按照特定机制为多个线程分配CPU的使用权
    void setPriority(int  newPriority)    更改线程的优先级
    static void sleep(long millis)    在指定的毫秒数内让当前正在执行的线程休眠
    void join()    等待该线程终止
    static void yield()    暂停当前正在执行的线程对象,并执行其他线程
    void interrupt()    中断线程
    boolean isAlive()    测试线程是否处于活动状态

    线程优先级

    线程优先级由1~10表示,1最低,默认优先级为5
    优先级高的线程获得CPU资源的概率较大

    线程休眠

    让线程暂时睡眠指定时长,线程进入阻塞状态
    睡眠时间过后线程会再进入可运行状态
        public static void sleep(long millis)
        millis为休眠时长,以毫秒为单位
        调用sleep()方法需处理InterruptedException异常

    线程强制运行

    使当前线程暂停执行,等待其他线程结束后再继续执行本线程
        millis:以毫秒为单位的等待时长
        nanos:要等待的附加纳秒时长
        需处理InterruptedException异常

    线程的礼让

    暂停当前线程,允许其他具有相同优先级的线程获得运行机会
    该线程处于就绪状态,不转为阻塞状态    public static void yield()
    只是提供一种可能,但是不能保证一定会实现礼让

    多线程数据共享

    1. public class Site implements Runnable {
    2. // 定义属性表示票库里的票的数量
    3. private int count = 10;
    4. // 定义属性表示用户买到的是第几张票
    5. private int num = 0;
    6. @Override
    7. public void run() {
    8. // 如果票的属性小于0,就不再买票
    9. while (true) {
    10. if (count <= 0) {
    11. break;
    12. }
    13. // 每卖一张票,票的总数要建议,卖的是第几张票,变量要+1
    14. count--;
    15. num++;
    16. // 买票过程中模拟网速缓慢
    17. try {
    18. Thread.sleep(1000);
    19. } catch (InterruptedException e) {
    20. // TODO Auto-generated catch block
    21. e.printStackTrace();
    22. }
    23. System.out.println(Thread.currentThread().getName() + "买到了第" + num
    24. + "张票,还剩" + count + "张票");
    25. }
    26. }
    27. }
    1. Site site1 = new Site();
    2. Thread t1 = new Thread(site1,"张三");
    3. Thread t2 = new Thread(site1,"李四");
    4. Thread t3 = new Thread(site1,"王五");
    5. t1.start();
    6. t2.start();
    7. t3.start();

    当多个线程操作共享数据的时候容易出现问题
    在一个线程操作这个共享数据的时候,还没有完全操作完毕,线程失去了CPU资源,cpu被另一个线程获取,另外一个线程会接着上一个线程操作的数据继续进行操作,当另外一个线程操作数据完毕之后,第一个线程有获取了CPU资源,此时,第一个线程看到的数据是第二个线程操作后的数据,由此就会引发数据不安全的问题

    同步方法 

     使用synchronized修饰的方法控制对类成员变量的访问

    访问修饰符 synchronized 返回类型 方法名(参数列表){……}

    synchronized 访问修饰符 返回类型 方法名(参数列表){……}

    synchronized就是为当前的线程声明一把锁

    使用同步方法的网络购票

    1. public synchronized boolean sale() {
    2. // 如果票的数量小于0,就不在卖票
    3. if (count <= 0) {
    4. return false;
    5. }
    6. // 每卖一张票,票的总数要-1,卖的是第几张票变量要+1
    7. count--;
    8. num++;
    9. // 买票过程中模拟网速缓慢
    10. try {
    11. Thread.sleep(1000);
    12. } catch (InterruptedException e) {
    13. e.printStackTrace();
    14. }
    15. System.out.println(Thread.currentThread().getName() + "买到了第" + num
    16. + "张票,还剩余" + count + "张票");
    17. return true;
    18. }
    19. // 定义属性表示票库里的票的数量
    20. private int count = 10;
    21. // 定义属性表示用户买到的是第几张票
    22. private int num = 0;
    23. @Override
    24. public void run() {
    25. while (true) {
    26. if(!sale()){
    27. break;
    28. }
    29. }
    30. }

     使用synchronized关键字修饰的代码块

    1. // 定义属性表示票库里的票的数量
    2. private int count = 10;
    3. // 定义属性表示用户买到的是第几张票
    4. private int num = 0;
    5. @Override
    6. public void run() {
    7. while (true) {
    8. synchronized (this) {
    9. // 如果票的数量小于0,就不在卖票
    10. if (count <= 0) {
    11. break;
    12. }
    13. // 每卖一张票,票的总数要-1,卖的是第几张票变量要+1
    14. count--;
    15. num++;
    16. // 买票过程中模拟网速缓慢
    17. try {
    18. Thread.sleep(1000);
    19. } catch (InterruptedException e) {
    20. e.printStackTrace();
    21. }
    22. System.out.println(Thread.currentThread().getName() + "买到了第"
    23. + num + "张票,还剩余" + count + "张票");
    24. }
    25. }
    26. }

     

    线程安全的类型

     为达到安全性和效率的平衡,可以根据实际场景来选择合适的类型

    常见类型的对比

    Hashtable  &&  HashMap

        Hashtable
            继承关系:实现了Map接口,Hashtable继承Dictionary类
            线程安全,效率较低
            键和值都不允许为null
        HashMap
            继承关系:实现了Map接口,继承AbstractMap类
            非线程安全,效率较高
            键和值都允许为null

    StringBuffer  &&  StringBuilder

        前者线程安全,后者非线程安全

  • 相关阅读:
    rt_thread生成工程模板
    redux 持久化(redux-persist) 结合 immutable 使用问题
    自动化测试的定位及一些思考
    px转rem插件postcss-plugin-px2rem使用方法(浏览器缩放页面自适应)
    drools中query的使用
    欧美风商务简约通用PPT模板
    12c++呵呵老师【变量,定时器和事件】
    SpringBoot使用LogAspect的切面日志
    2022流星雨,你的硬盘raw了吗?
    mybatisplus代码生成覆盖
  • 原文地址:https://blog.csdn.net/qihaojinqiuma/article/details/126424063