zoukankan      html  css  js  c++  java
  • Thread

    程序 可以理解为静态代码
    
    进程 正在进行的程序 静态的代码 运行起来
    
    线程 正在执行程序中的小单元
    
    1.主线程   系统线程
    
    2.用户线程   main
    
    3.守护线程    gc(跟随系统线程)
    
    线程------------操作系统级别 cpu
    

    如何在java中创建线程 让线程执行 多线程

    线程的状态

      ne   start( cpu分配run()  wait()      exception/over
    创建线程---就绪状态--执行状----等待/挂起-------异常/消亡           
                    |                               |
                    |                               |
                    |_______________________________|
                            notify(唤醒)/notifyAll(唤醒所有)
    

    实现线程的过程

    方法一:(存在问题:单继承,子类继承父类时,无法再继承线程)

    1.自己描述一个类
    2.继承父类的Thread
    3.重写run方法
    4.new一个线程队形 调用start() 让线程进入就绪状态

    方法二:

    1.自己描述一个类
    2.实现一个父接口Runnable
    3.重写run方法
    4.new一个线程队形 需要创建Thread将自己的对象包起来 然后调用start()

    特征修饰符

    synchronized(线程安全锁) 同步 一个时间点只有一个线程访问

    1.将synchronized关键字放在方法的结构上

    public synchronized void test(){} 锁定的是调用方法时的对象
    

    2.将synchronized关键字放在方法(构造方法 块)的内部

    public void get(){
        代码1
            synchronized(对象){//除了能锁定当前对象(this),也可以锁定其他对象
            代码2
        } 
        代码3
    }
    

    线程状态的切换

    执行 等待 执行 等待

    Object类中的方法:

    wait() 对象.wait()--访问当前对象的线程进入wait状态
    notify()/notifyAll()

    Thread中的方法

    sleep()
    run()
    start()
    所有线程都进入wait状态的话,会产生假死状态:没有线程做事
    
    不加锁可能出现的异常:
    
    ArrayIndexOutOfBounsException:-1:数组越界
    
    IllegalMonitorStateException:让其等待的线程对象不是当前线程的所有者															(访问仓库的线程等待,告知生产者的这一刹那,对象变成了另一个线程)
    

    完善生产者消费模型

    1.利用线程安全锁 特征修饰符(同步锁) synchronized

    两种不同的写法
    不管怎样写 锁定的永远是对象

    2.利用方法控制线程状态的来回切换

    wait
    notify notifyAll

    3.Thread类中的方法

    sleep() 静态方法(毫秒值)
    setPrioity(10) getPriority()------设置/获取线程的优先级 1-10

    sleep()与wait()的区别

    			 sleep()                     wait()
    
    1.类         Thread类                     Object类
    
    2.调用        静态 类名.                     对象.
    
    3.理解     哪个线程调用                   访问该对象的线程进入等待
    		   哪个线程等待                   状态
    
    4.唤醒      不需要别人                  需要其他对象调用notify唤醒
    
    5.锁         不会释放锁                    等待后会释放锁
    

    join()--Thread中的方法

    让多个线程并行变成单个线程

    testjoin模型:
    设计模型的时候,two线程在one的run里面创建  两个有先后顺序
    模型执行顺序:
    one 启动
    two 启动
    three 启动
    two.join()
    2000之后, one想要把two从自己线程内剔除
    two对象不在自己手里 被three锁定 10000
    one只能等待three将two对象释放后 才能踢掉   
    synchronized锁,一旦对象被锁定,其他的对象都需要等待
    有可能会产生一个死锁的效果
    

    6.死锁

    模拟一个模型 演示死锁(哲学家就餐问题)
    四个线程同时并发去抢夺相同的资源

    解决死锁问题:

    1.礼让---产生时间差
    2.不要产生对象公用的问题
    计时器/定时器----->线程应用
    java.util包
    Timer类
    无参数构造方法 创建对象
    timer.schedule()   
    
  • 相关阅读:
    2017ccpc全国邀请赛(湖南湘潭) E. Partial Sum
    Codeforces Round #412 C. Success Rate (rated, Div. 2, base on VK Cup 2017 Round 3)
    2017 中国大学生程序设计竞赛 女生专场 Building Shops (hdu6024)
    51nod 1084 矩阵取数问题 V2
    Power收集
    红色的幻想乡
    Koishi Loves Segments
    Wood Processing
    整数对
    Room and Moor
  • 原文地址:https://www.cnblogs.com/zh93/p/13836627.html
Copyright © 2011-2022 走看看