java 多线程

129 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

  • 逛牛客的时候经常会看到有关于 Java 并发相关的面试问题,所以打算对 Java 并发内容进行整理总结。这是第一篇。

线程 & 进程

  • 进程 :计算机上所有可运行的软件 (包括操作系统) ,正在执行程序的实例就是一个进程。进程创建发生的四个步骤 --> ① 系统初始化;② 正在运行的程序执行了创建进程的系统调用;③ 用户请求创建一个新进程;④ 一个批处理作业的初始化。
  • 线程 :一个进程包含着一个或多个线程,这些线程会共享这个进程的内存地址和所有的数据,也称为 “迷你进程” 。

开启线程

  • 定义任务:实现 Runneable 接口并重写 run() 方法。其中 Thread.yield() 是 Java 线程机制的一部分,将 CPU 从一个线程转移到另一个线程。
public class LightOff implements Runnable {
    protected int countDown = 10;
    private static int taskCount = 0;
    private final int id = taskCount++;
    public LightOff() {}
    public String status() {
        return id + " : " + (countDown > 0 ? countDown : "lightOff!");
    }
    public void run() {
        while (countDown-- > 0) {
            System.out.println(status());
            Thread.yield();
        }
    }
}
  • 线程驱动方式
  1. 直接 new 实例,用实例调 run() 方法。
public class LightOffTest {
    public static void main(String[] args) {
        LightOff lightOff = new LightOff();
        lightOff.run();
    }
}
  1. 把 Runnable 对象工作任务提交给 Thread 构造器,由 Thread 构造器 来驱动 Runnnable 对象。
public class LightOffTest {
    public static void main(String[] args) {
        LightOff lightOff = new LightOff();
        Thread thread = new Thread(lightOff);
        thread.start();
    }
}
  1. 使用 Executor 管理 Thread 对象,简化并发编程,线程任务由 CachedThreadPool 创建。
  • SingleThreadExecutor --> 当有多个任务提交时,会将这些任务进行排队,每个任务都会在下一个任务开始之前结束,所有任务都会使用一个线程。
  • FixedThreadPool --> 会使用有限的线程集来执行所提交的任务,有利于减小了时间开销。
  • CachedThreadPool --> 对执行任务线程的数量没有限制。
public class LightOffTest {
    public static void main(String[] args) {
        ExecutorService exec1 = Executors.newCachedThreadPool();
//        ExecutorService exec2 = Executors.newFixedThreadPool(5);
//        ExecutorService exec3 = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 5; i++) {
            exec1.execute(new LightOff());
        }
        exec1.shutdown();
    }
}

其他调用

  • 休眠 :执行 Thread.sleep(1000) 当前线程会等待 1s 后再执行。
  • 优先级 :通过 Thread.currentThread.setPriority(priority) 来设置线程优先级,priority 可 为:① Thread.MAX_PRIORITY; ② Thread.NORM_PRIORITY; ③ Thread.MIN_PRIORITY;

总结

  • 通过实现 Runnnable 开启任务线程,可以 调用实例的 run() 方法,或者交付给 Thread 构造器,或者把 Thread 交付给 Executor 管理。