zoukankan      html  css  js  c++  java
  • Java中的多线程

    实现多线程的方式:

    继承Thread:

    1:先有一个类 继承 Thread类
    2:重写 Thread 类里面 run方法, 把你要让新线程 做的任务 写在 run方法里面
    3:在测试类中 创建这个类的对象
    4:不是调用run方法, 而是要调用start方法, 线程就开启了。

    方法:

    设置线程的名字:通过Thread的构造方法,Thread类里面的setName()方法
    获取线程的名字:getName()
    获取当前线程Thread.currentThread()
    线程的优先级getPriority()

    void join();插队,优先执行


    守卫线程void setDaemon(boolean b); 主线程结束,JVM关闭,守卫线程结束。

    Runnable:

    1:先有一个类 ,实现 Runnable 接口
    2:重写 Runnable 类里面 run方法, 把你要让新线程 做的任务 写在 run方法里面
    3:创建这个类的对象
    4:创建Thread对象 并Runnable的子类对象 作为 Thread类的 构造方法的参数传递进去
    5:让Thread的对象 调用start方法


    第二种方式符合高内聚低耦合的设计思想。实现了线程与线程任务的分离。

    同步:

    非静态方法同步:


    非静态同步代码块(不用写那个对象了,默认带this):



    可以转换为非静态同步方法:

    静态同步方法:


    总结:

    非静态的同步方法的锁对象 是this
    静态的同步方法的锁对象 是 当前方法所在的类的 class 文件对象,

    class Student {
    
        public void show(){
            synchronized(this){
                //n行代码 1
            }
        }
    
        public synchronized void show(){
            //n行代码 1
        }
    
    
        public static void method(){
            synchronized(Student.class){
                //n行代码 2
            }
        }
    
        public static synchronized void method(){
            //n行代码 2
        }
    }
    

    Lock:



    线程安全的类

    Map :

    Hashtable : jdk1.0的时候出现的。 效率低。 就是因为他线程安全的。
    Properties
    HashMap 代替 Hashtable
    ArrayList 代替 Vector
    StringBuilder 代替 StringBuffer

    Collections里面有方法可以生成一个线程安全的list,set,map。

    PV操作:

    实现方法——wait(),notify(),notifyAll():


    它们都继承自Object,必须在同步代码块里调用,并且必须使用锁对象调用,锁对象不能是任意对象。

    wait():

    当前线程暂停(放弃占用CPU进入等待状态)直到另一个线程调用该对象的notify()或者notifyAll()方法。

    notify():

    唤醒线程队列里随机的一个线程

    notifyAll():

    唤醒线程队队列里全部线程

    经典的单缓冲区生产者消费者问题:

    奶箱类:



    this.wait()的含义是:
    state为true表示有奶则线程producer进入put()方法并且将producer线程停下来(this.wait()),
    等待一个customer线程get()到奶并且调用notify()或者notifyAll(),把在put()方法里的producer线程唤醒,
    producer就可以生产奶了。

    生产者类:

    消费者类:

    测试类:

    测试结果:

  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/maomaodesu/p/11923733.html
Copyright © 2011-2022 走看看