1.进程和线程

  进程:应用程序的执行实例,有独立的内存空间和系统资源

 线程:CPU调度和分派的基本单位,进程中执行运算的最小单位,可完成一个独立的顺序控制流程

 线程的生命周期:创建状态、就绪状态、运行状态、阻赛状态、死亡状态

  1. 什么是多线程

 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”

多个线程交替占用CPU资源,而非真正的并行执行

实现多线程有哪几种方法?

1、继承Thread类实现多线程

2、实现Runnable接口方式实现多线程

3、使用ExecutorService、Callable、Future实现有返回结果的多线程

  1. 多线程好处

1>充分利用CPU的资源

2>简化编程模型

3>带来良好的用户体验

4.Thread

Java提供了java.lang.Thread类支持多线程编程

5.主线程

main()方法即为主线程入口

产生其他子线程的线程

必须最后完成执行,因为它执行各种关闭动作

6.线程的创建和启动

Java中创建线程的两种方式:

继承java.lang.Thread

实现java.lang.Runnable接口

使用线程的步骤

1>定义线程

2>创建线程对象

3>启动线程

4>终止线程

7.继承Thread类创建线程

1>定义MyThread类继承Thread

2>重写run()方法,编写线程执行体

3>创建线程对象,调用start()方法启动线程

4>多个线程交替执行,不是真正的“并行”

5>线程每次执行时长由分配的CPU时间片长度决定

8.实现Runnable接口创建线程

1>定义MyRunnable类实现Runnable接口

2>实现run()方法,编写线程执行体

3>创建线程对象,调用start()方法启动线程

9.比较两种创建线程的方式

  继承Thread

编写简单,可直接操作线程

适用于单继承

实现Runnable接口

避免单继承局限性

便于共享资源

10.线程调度

 线程调度指按照特定机制为多个线程分配CPU的使用权

  方法名                           

setPriority(int newPriority)   更改线程的优先级

static void sleep(long millis)  在指定的毫秒数内让当前正在执行的线程休眠

void join()              等待该线程终止

static void yield()       暂停当前正在执行的线程对象,并执行其他线程

void interrupt()         中断线程

boolean isAlive()        测试线程是否处于活动状态

11.线程优先级

线程优先级由1~10表示,1最低,默认优先级为5

优先级高的线程获得CPU资源的概率较大

12.线程休眠

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

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

millis为休眠时长,以毫秒为单位

调用sleep()方法需处理InterruptedException异常

13.线程的强制运行

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

millis:以毫秒为单位的等待时长

nanos:要等待的附加纳秒时长

需处理InterruptedException异常

14.线程的礼让

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

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

public static void yield()

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

  1. 同步方法

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

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

        或者

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

synchronized就是为当前的线程声明一个锁

  1. 同步代码块

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

   synchronized(syncObject){

    //需要同步的代码

}

 2>syncObject为需同步的对象,通常为this

效果与同步方法相同

public void run() {

while (true) {

synchronized (this) {   //同步代码块

// 省略修改数据的代码......

// 省略显示信息的代码......

}}}

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

同一时刻只能有一个线程进入synchronizedthis)同步代码块

当一个线程访问一个synchronizedthis)同步代码块时,其他synchronizedthis)同步代码块同样被锁定

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

 

  1. 线程安全的类型

ArrayList类的add()方法为非同步方法

当多个线程向同一个ArrayList对象添加数据时,可能出现数据不一致问题

ArrayList为非线程安全的类型

        方法是否同步  效率比较  适合场景

线程安全               多线程并发共享资源

非线程安全                 单线程

 

为达到安全性和效率的平衡,可以根据实际场景来选择合适的类型

  1. 常见类型对比

1>Hashtable  &&  HashMap

(1)Hashtable

(2)继承关系

实现了Map接口,Hashtable继承Dictionary

(3)线程安全,效率较低

(4)键和值都不允许为null

2>HashMap

(1)继承关系

实现了Map接口,继承AbstractMap

(2)非线程安全,效率较高

(3)键和值都允许为null

3>StringBuffer  &&  StringBuilder

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