马士兵java架构师

您现在的位置是:java学习笔记 >

java学习笔记

java并发包面试题

2024-05-17 02:18:06java学习笔记 本文浏览次数:0 百度已收录

本 文 目 录

java并发包面试题
#### 一、并发编程概述

在软件开发中,并发编程是一种能够提高程序执行效率的技术,它允许多个任务同时进行。Java提供了一套丰富的并发API,使得开发者能够更容易地编写多线程程序。并发编程的核心在于线程的创建、同步、通信以及线程安全。

二、并发与并行的区别

并发编程与并行编程常常被混淆,但它们实际上是两个不同的概念:

  • 并发:指的是在宏观上,多个任务在同一个时间段内交替执行,给用户一种“同时进行”的感觉。
  • 并行:指的是在微观上,多个任务真正地同时执行,这通常需要多核处理器的支持。
特性 并发 并行
定义 时间段内任务交替执行 任务真正同时执行
执行方式 单个CPU核心,任务切换执行 多个CPU核心,任务同时执行
硬件需求 单核处理器即可 多核处理器
应用场景 用户界面、I/O密集型应用 计算密集型应用

三、核心类与方法

Java并发包java.util.concurrent中包含了多个核心类,以下是一些常用的:

  • ExecutorService:用于创建线程池,管理线程的生命周期。
  • Callable:与Runnable相似,但可以有返回值和抛出异常。
  • Future:表示可能还没有完成的异步计算结果。
  • CountDownLatch:允许一个或多个线程等待一组其他线程完成操作。
  • CyclicBarrier:类似于CountDownLatch,但它可以重用。
  • Semaphore:一个计数信号量,用于控制多个线程同时访问某个特定资源。

四、使用场景

  1. 线程池:适用于有大量短生命周期任务的场景,如Web服务器处理请求。
  2. 同步器:如CountDownLatch和CyclicBarrier,适用于需要协调多个线程的场景。
  3. :如ReentrantLock,适用于需要确保线程安全的场合。

五、代码案例

1. 使用线程池执行任务
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 5; i++) {
            int finalI = i;
            executor.submit(() -> {
                System.out.println("Task " + finalI + " is running.");
            });
        }
        executor.shutdown();
    }
}
2. 使用CountDownLatch协调线程
import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        int threadCount = 3;
        CountDownLatch latch = new CountDownLatch(threadCount);

        // 创建并启动线程
        for (int i = 0; i < threadCount; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " is running.");
                try {
                    Thread.sleep(1000); // 模拟工作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                latch.countDown(); // 通知完成
            }, "Thread-" + i).start();
        }

        latch.await(); // 主线程等待所有线程完成
        System.out.println("All tasks are completed.");
    }
}

六、总结

并发编程是Java中一个非常重要且复杂的领域,它涉及到线程的创建、执行、同步和安全等多个方面。合理利用Java并发包中的类和接口,可以有效提高程序的性能和响应速度。通过理解并发与并行的区别,掌握核心类和方法的使用,以及熟悉各种同步器的使用场景,可以编写出更加健壮和高效的并发程序。