DAY17Java语言入门基础教学 多线程

多线程

线程与进程

  1. 进程 正在运行的一个程序
    系统会为这个进程分配独立的内存资源
  2. 线程 具体执行任务的最小单位
  • 一个进程最少拥有一个线程(主线程 运行起来就执行的线程)
  • 线程之间是共享内存资源的(进程申请的)
  • 线程之间可以通信(数据传递 多数为主线程和子线程)
  • 每一个线程都有自己的运行回路(生命周期)
  • 线程的生命周期 状态


    DAY17Java语言入门基础教学 多线程_第1张图片
    线程的生命周期

NEW 新建 线程刚被创建好
RUNNABLE 就绪状态 只要抢到时间片就可以运行这个线程
BLOCKED 阻塞状态 sleep wait
WAITING 等待 wait
TIMED_WAITING
TERMINATED

多线程

为什么需要创建一个子线程?

如果在主线程中存在比较耗时的操作, 这些操作会阻塞主线程, 后面的任务必须等这些任务执行完毕之后才执行, 用户体验差, 为了不阻塞主线程, 需要将耗时的任务放在子线程中执行

如何创建一个子线程?

  1. 协议类继承于 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();
    }
}
  1. 实现Runnable接口 实现run方法
  • 创建任务 创建类实现Runnable接口
  • 使用Thread为这个任务分配线程
  • 开启任务 start


    DAY17Java语言入门基础教学 多线程_第2张图片
    Runnable
  1. 通过 Callable 和 Future 创建线程
  • 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。
  • 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
  • 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。
  • 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。

三种方法对比

  1. 采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。
  2. 使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。

体会

你可能感兴趣的:(DAY17Java语言入门基础教学 多线程)