@MRsunhuimin
2019-07-31T13:16:48.000000Z
字数 2665
阅读 211
java基础
1. 进程(PROCESS):CPU的执行路径
2. 多进程:系统中同时运行多个程序
3. 线程(THREAD):运行在进程当中的运行单元
4. 多线程:每个进程里面有多个独立的或者相互有协作关系的运行单元
其中 Thread实现Runnable;符合模板设计模式(声明一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑);即继承Runnable接口,实现其抽象方法run,而run方法是由JVM线程调用并运行
优势:
a.在 java 中单继承而多实现,如果通过继承 Thread 类来实现线程,就会打破原有的类间的父子关系;而通过实现 Runnable 接口可避免此问题,接口可继承多个
b.实现 Runnable接口,可将业务逻辑与线程管理分离开,符合策略设计模式
Thread: 编写简单,可直接操作线程
适用于单继承
负责线程本身的功能继承Thread类
Runnable: 避免单继承局限性
便于共享资源
专注于业务逻辑的实现
两者职责功能不同,不具有可比性
Runnable中的run方法,即使不在Thread中使用,他在其他地方照样也能使用,并不能说Runnable就是一个线程
创建状态 就绪状态 运行状态 阻塞状态 死亡状态
01.新生状态
MyThread thread=new MyThread();
02.就绪状态
thread.start();
03.运行状态
cpu分配时间片给thread的时候,开始运行run();
04.阻塞状态
sleep();wait();join()
05.死亡状态
001.正常 run()执行完毕 正常的!
002.异常 run()执行过程中,出现异常的情况,非正常退出!
1. 线程优先级由1~10表示,1最低,默认优先级为5
Thread.MAX_PRIORITY 最高优先级10
Thread.MIN_PRIORITY 最低优先级1
2. 优先级高的线程获得CPU资源的概率较大
1. 让线程暂时睡眠指定时长,线程进入阻塞状态
2. 睡眠时间过后线程会再进入可运行状态
使当前线程暂停执行,等待其他线程结束后再继续执行本线程
public final void join()
public final void join(long mills)
public final void join(long mills,int nanos)
millis:以毫秒为单位的等待时长
nanos:要等待的附加纳秒时长
需处理InterruptedException异常
public static void yield()
1. 暂停当前线程,允许其他具有相同优先级的线程获得运行机会
2. 该线程处于就绪状态,不转为阻塞状态
3. 只是提供一种可能,但是不能保证一定会实现礼让
Main 函数本身就是一个线程,即主线程:
Thread.currentThread()
JVM 本身有很多后台线程在运行
由于CPU的时间片轮寻,可能每个线程都没有执行完毕整个流程,中途就有其他的线程插入进来进行执行,所以导致数据获取时线程安全问题;被访问的数据没有被保护起来,而引起数据共享的安全问题
使用synchronized修饰的方法控制对类成员变量的访问
访问修饰符 synchronized 返回类型 方法名(参数列表){……}
或者:
synchronized 访问修饰符 返回类型 方法名(参数列表){……}
使用synchronized关键字修饰的代码块
synchronized(syncObject){
//需要同步的代码
}
//syncObject为需同步的对象,通常为this
//效果与同步方法相同
1. 同一时刻只能有一个线程进入synchronized(this)同步代码块
2. 当一个线程访问一个synchronized(this)同步代码块时,其他synchronized(this)同步代码块同样被锁定
3. 当一个线程访问一个synchronized(this)同步代码块时,其他线程可以访问该资源的非synchronized(this)同步代码
线程调度指按照特定机制为多个线程分配CPU的使用权
方法 | 说明 |
---|---|
void setPriority(int newPriority) | 更改线程的优先级 |
static void sleep(longmillis) | 在指定的毫秒数内让当前正在执行的线程休眠 |
void join() | 等待该线程终止 |
static void yield() | 暂停当前正在执行的线程对象,并执行其他线程 |
void interrupt() | 中断线程 |
boolean isAlive() | 测试线程是否处于活动状态 |
线程是否安全 | 方法是否同步 | 效率比较 | 适合场景 |
---|---|---|---|
线程安全 | 是 | 低 | 多线程并发共享资源 |
线程不安全 | 否 | 高 | 单线程 |
Hashtable
1. 继承关系
实现了Map接口,Hashtable继承Dictionary类
2. 线程安全,效率较低
3. 键和值都不允许为null
HashMap
1. 继承关系
实现了Map接口,继承AbstractMap类
2. 非线程安全,效率较高
3. 键和值都允许为null
前者线程安全,后者非线程安全
详细解释见《扩展知识点》
start():真正的启动线程!并不是线程真正的执行!在调用start(),底层默认会执行run()!
run():普通的方法,也称为线程体!cpu分配时间片给当前线程的时候, 线程才真正的执行!
join():当前线程暂停执行,强制执行其他线程,当前线程处于阻塞状态
yield():暂停当前线程,使其他具有相同优先级的线程获得运行机会,该线程处于就绪状态,不转为阻塞状态
sleep():让当前线程暂时睡眠指定时长,线程进入阻塞状态,睡眠时间过后线程会再进入可运行状态