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();
}
}
}
- 线程驱动方式
- 直接 new 实例,用实例调 run() 方法。
public class LightOffTest {
public static void main(String[] args) {
LightOff lightOff = new LightOff();
lightOff.run();
}
}
- 把 Runnable 对象工作任务提交给 Thread 构造器,由 Thread 构造器 来驱动 Runnnable 对象。
public class LightOffTest {
public static void main(String[] args) {
LightOff lightOff = new LightOff();
Thread thread = new Thread(lightOff);
thread.start();
}
}
- 使用 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 管理。