JAVA多线程

进程:正在运行中的程序
线程:线程共享存储空间,为了让多个方法能够同时运行

单线程的优点:安全,但是效率不行
多线程:效率高,但是会有潜在的问题

线程的运行模式

分时调度

平均分配时间

抢占模式

根据优先级分配不同的线程时间。
优先级高的程序占用更多的CPU时间。

main 的主线程

程序从上到下执行过程

  1. java demo
  2. 启动 JVM,运行 Demo.main
  3. JVM 运行方法 main,找操作系统,开线程
  4. 对于CPU有了一个执行的路径,运行方法main路径有个名字 "main"

Thread 类 线程

虚拟机允许线程并发运行多个程序

创建新执行线程有两种方法

一种将类申明为 Thread 子类
一种是重写 runnable 方法

线程继承 Thread

用 start 启动
会自动让虚拟机找到 run 方法

获取线程名字的方法 getName

每个线程都有默认的编号名称 Thread -0,1....
非静态

currentThread

jvm 开启主线程 Thread 类对象
static Thread currentThread() 返回正在执行的线程对象

setName

应该先改名,再开启线程
Thread.setName()

sleep

休眠制定方法
Thread.sleep(ms)

实现 runnable 接口

重写 run 方法
接口可以多实现; 继承只能单继承

实现 runnable 接口的好处

  1. 更加符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务
  2. 继承 Thread 类时,线程对象和线程任务耦合在一起,一旦创建Thread 类的子类任务,既是线程对象,又是线程任务。
  3. 实现Runnable 接口,将线程任务单独分离出来封装成对象,类型就是 Runnable 接口类型,Runnable 接口对线程对象和线程任务进行解耦。

高内聚,低耦合
让资源实现共享

匿名内部类实现多线程

节省代码,但是 格式比较奇怪

线程的状态

  1. new 至今尚未启动的线程: new Thread()
  2. runnable 运行状态,正在执行 start()
  3. terminated 死亡状态 run() 结束 stop()(不建议)
  4. blocked 受阻塞 和运行状态转换 取决于 CPU 运行状态
  5. timed waitting 休眠,一定时间之后会自动唤醒 运行 sleep 的状态、
  6. waitting 无限的等待 使用 notify 进行 唤醒 在 object 类中


    多线程状态转换.png

受阻塞: 线程具有 CPU 执行资格,等待 CPU 的资源
休眠等待:线程放弃CPU的执行资格

线程池

线程池基本概念

一个可以容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

缓冲池 减少资源开销
新建和销毁线程,会造成较大的开销,需要减少这两种操作

JDK5 之后,内置了线程池

JDK5 中的线程池

使用工厂类

java

public class ThreadPoolDemo{
}

你可能感兴趣的:(JAVA多线程)