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()   
    
  • 相关阅读:
    sublime配置文件设置解释器
    pyinstaller 简单用法
    python模块引入问题集锦与解析
    服务器上Ubuntu系统安装
    window下共存python2和python3
    python-docx about unusual operating
    docker
    网站开发(周日):项目部署上线(实战)
    网站开发(周六):项目本地调试(实战)
    网站开发(周五):项目前端页面开发(实战)
  • 原文地址:https://www.cnblogs.com/zh93/p/13836627.html
Copyright © 2011-2022 走看看