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

    生产者类:

    消费者类:

    测试类:

    测试结果:

  • 相关阅读:
    《Effective C#中文版:改善C#程序的50种方法》读书笔记
    WPF总结
    定义集合属性(WPF)
    c#只读字段和常量的区别,以及静态构造函数的使用 .
    编程方法的参数
    关于事件的点滴总结
    线程间的消息(或数据)传递
    OOP的感悟
    VS2010快捷键大全----养成良好的习惯
    UTF-8里包括GB2312
  • 原文地址:https://www.cnblogs.com/maomaodesu/p/11923733.html
Copyright © 2011-2022 走看看