多线程
线程与进程
- 进程 正在运行的一个程序
系统会为这个进程分配独立的内存资源 - 线程 具体执行任务的最小单位
- 一个进程最少拥有一个线程(主线程 运行起来就执行的线程)
- 线程之间是共享内存资源的(进程申请的)
- 线程之间可以通信(数据传递 多数为主线程和子线程)
- 每一个线程都有自己的运行回路(生命周期)
-
线程的生命周期 状态
NEW 新建 线程刚被创建好
RUNNABLE 就绪状态 只要抢到时间片就可以运行这个线程
BLOCKED 阻塞状态 sleep wait
WAITING 等待 wait
TIMED_WAITING
TERMINATED
多线程
为什么需要创建一个子线程?
如果在主线程中存在比较耗时的操作, 这些操作会阻塞主线程, 后面的任务必须等这些任务执行完毕之后才执行, 用户体验差, 为了不阻塞主线程, 需要将耗时的任务放在子线程中执行
如何创建一个子线程?
- 协议类继承于 Thread 实现run方法
- join 让当前这个线程阻塞 等join的线程执行完毕再执行
- setName 设置线程名称
- getName 获取线程名称
- currentThread 获取当前运行的线程名称
- start 开启线程
lass Ticker extends Thread{
private int i;
@Override
public void run() {
for(i=1;i<=100;i++) {
//返回当前线程的名字
System.out.println(getName()+":"+i);
}
}
public static void main(String[] args){
//main方法里面执行的代码 是在主线程里面执行的
//(geiName) 主线程的名称是main
String name = Thread.currentThread().getName();
System.out.println(name);
//创建Thread的对象
Ticker tt1 = new Ticker();
//设置线程的名称
tt1.setName("子线程1");
//开启任务
tt1.start();
}
}
- 实现Runnable接口 实现run方法
- 创建任务 创建类实现Runnable接口
- 使用Thread为这个任务分配线程
-
开启任务 start
- 通过 Callable 和 Future 创建线程
- 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。
- 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
- 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。
- 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。
三种方法对比
- 采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。
- 使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。