[关闭]
@MRsunhuimin 2019-07-31T13:16:48.000000Z 字数 2665 阅读 211

java (07.29-07.30)

java基础

作者:孙慧敏

1. 多进程多线程概述

    1. 进程(PROCESS):CPU的执行路径

    2. 多进程:系统中同时运行多个程序

    3. 线程(THREAD):运行在进程当中的运行单元

    4. 多线程:每个进程里面有多个独立的或者相互有协作关系的运行单元

2. 多线程详解

2.1 线程创建

2.1.1 继承 Thread 类
    其中 Thread实现Runnable;符合模板设计模式(声明一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑);即继承Runnable接口,实现其抽象方法run,而run方法是由JVM线程调用并运行
2.1.2 实现Runnable接口(推荐使用)
    优势:

    a.在 java 中单继承而多实现,如果通过继承 Thread 类来实现线程,就会打破原有的类间的父子关系;而通过实现 Runnable 接口可避免此问题,接口可继承多个

    b.实现 Runnable接口,可将业务逻辑与线程管理分离开,符合策略设计模式
2.1.3 Thread和Runnable区别与联系
    Thread:    编写简单,可直接操作线程
                适用于单继承
                负责线程本身的功能继承Thread类


    Runnable:  避免单继承局限性
                便于共享资源
                专注于业务逻辑的实现

    两者职责功能不同,不具有可比性

    Runnable中的run方法,即使不在Thread中使用,他在其他地方照样也能使用,并不能说Runnable就是一个线程

2.2 线程的5个状态

    创建状态    就绪状态    运行状态    阻塞状态    死亡状态

01.新生状态
    MyThread thread=new MyThread();

02.就绪状态
      thread.start();

03.运行状态
    cpu分配时间片给thread的时候,开始运行run();

04.阻塞状态 
    sleep();wait();join()

05.死亡状态
   001.正常     run()执行完毕    正常的!
   002.异常     run()执行过程中,出现异常的情况,非正常退出!

2.3 线程优先级 setPriority()方法

    1. 线程优先级由1~10表示,1最低,默认优先级为5
            Thread.MAX_PRIORITY         最高优先级10
            Thread.MIN_PRIORITY         最低优先级1
    2. 优先级高的线程获得CPU资源的概率较大

2.4 线程休眠 sleep()方法

    1. 让线程暂时睡眠指定时长,线程进入阻塞状态

    2. 睡眠时间过后线程会再进入可运行状态

2.5 线程的强制运行 join()方法

    使当前线程暂停执行,等待其他线程结束后再继续执行本线程

    public final void join()
    public final void join(long mills)
    public final void join(long mills,int nanos)

    millis:以毫秒为单位的等待时长
    nanos:要等待的附加纳秒时长
    需处理InterruptedException异常

2.6 线程的礼让 yield()方法

                public static void yield()

    1. 暂停当前线程,允许其他具有相同优先级的线程获得运行机会

    2. 该线程处于就绪状态,不转为阻塞状态

    3. 只是提供一种可能,但是不能保证一定会实现礼让

2.7 其他信息:

    Main 函数本身就是一个线程,即主线程:

        Thread.currentThread()

    JVM 本身有很多后台线程在运行

3. 线程的同步

3.1 多线程之间的数据共享引发的安全问题

        由于CPU的时间片轮寻,可能每个线程都没有执行完毕整个流程,中途就有其他的线程插入进来进行执行,所以导致数据获取时线程安全问题;被访问的数据没有被保护起来,而引起数据共享的安全问题

3.2 同步方法

使用synchronized修饰的方法控制对类成员变量的访问

    访问修饰符 synchronized 返回类型 方法名(参数列表){……}

或者:    
    synchronized 访问修饰符 返回类型 方法名(参数列表){……}

3.3 同步代码块

使用synchronized关键字修饰的代码块

  1. synchronized(syncObject){
  2. //需要同步的代码
  3. }
  4. //syncObject为需同步的对象,通常为this
  5. //效果与同步方法相同

3.4 多个并发线程访问同一资源的同步代码块时

1. 同一时刻只能有一个线程进入synchronized(this)同步代码块

2. 当一个线程访问一个synchronized(this)同步代码块时,其他synchronized(this)同步代码块同样被锁定

3. 当一个线程访问一个synchronized(this)同步代码块时,其他线程可以访问该资源的非synchronized(this)同步代码

4. 线程调度

    线程调度指按照特定机制为多个线程分配CPU的使用权
方法 说明
void setPriority(int newPriority) 更改线程的优先级
static void sleep(longmillis) 在指定的毫秒数内让当前正在执行的线程休眠
void join() 等待该线程终止
static void yield() 暂停当前正在执行的线程对象,并执行其他线程
void interrupt() 中断线程
boolean isAlive() 测试线程是否处于活动状态

5. 线程安全

线程是否安全 方法是否同步 效率比较 适合场景
线程安全 多线程并发共享资源
线程不安全 单线程

5.1 Hashtable && HashMap

Hashtable
    1. 继承关系
        实现了Map接口,Hashtable继承Dictionary类

    2. 线程安全,效率较低

    3. 键和值都不允许为null

HashMap
    1. 继承关系
        实现了Map接口,继承AbstractMap类

    2. 非线程安全,效率较高

    3. 键和值都允许为null

5.2 StringBuffer && StringBuilder

    前者线程安全,后者非线程安全

    详细解释见《扩展知识点》

6. 补充

6.1 run()和start()的区别

    start():真正的启动线程!并不是线程真正的执行!在调用start(),底层默认会执行run()!

    run():普通的方法,也称为线程体!cpu分配时间片给当前线程的时候, 线程才真正的执行!

6.2 join()方法和yield()方法、sleep()方法的区别

    join():当前线程暂停执行,强制执行其他线程,当前线程处于阻塞状态

    yield():暂停当前线程,使其他具有相同优先级的线程获得运行机会,该线程处于就绪状态,不转为阻塞状态

    sleep():让当前线程暂时睡眠指定时长,线程进入阻塞状态,睡眠时间过后线程会再进入可运行状态
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注