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就可以生产奶了。

    生产者类:

    消费者类:

    测试类:

    测试结果:

  • 相关阅读:
    布局(layout)文件图形界面不能显示:An error has occurred. See error log for more details. java.lang.NullPointe
    Mac下无法推出硬盘
    Excel导入导出数据库(MVC)
    json导入数据库
    XML导入数据库
    Excel表格导入数据库
    Lambda高级查询
    Linq高级查询
    多线程
    反射
  • 原文地址:https://www.cnblogs.com/maomaodesu/p/11923733.html
Copyright © 2011-2022 走看看