Java多线程面试题:线程同步与调度方法总结

Répondu en utilisant GPT-4o-mini par Java Q&A Hub

Question :

Java面试题之多线程 请说出与线程同步以及线程调度相关的方法。

Réponse :

在Java中,线程同步和线程调度是多线程编程中非常重要的概念。以下是与线程同步和线程调度相关的一些方法和概念:

线程同步相关的方法

  1. synchronized关键字

    • 用于修饰方法或代码块,确保同一时间只有一个线程可以执行被修饰的代码。
    • 示例:
      public synchronized void synchronizedMethod() {
          // 线程安全的代码
      }
      
  2. Lock接口

    • java.util.concurrent.locks.Lock接口提供了比synchronized更灵活的锁机制。
    • 常用的实现类有ReentrantLock
    • 示例:
      Lock lock = new ReentrantLock();
      lock.lock();
      try {
          // 线程安全的代码
      } finally {
          lock.unlock();
      }
      
  3. Condition接口

    • Lock一起使用,提供了更灵活的线程间通信机制。
    • 示例:
      Condition condition = lock.newCondition();
      lock.lock();
      try {
          // 等待条件
          condition.await();
          // 处理条件满足后的逻辑
      } finally {
          lock.unlock();
      }
      
  4. volatile关键字

    • 用于修饰变量,确保变量的可见性,防止线程缓存中的数据不一致。
    • 示例:
      private volatile boolean flag = false;
      
  5. Thread.join()

    • 使当前线程等待直到被调用的线程完成。
    • 示例:
      thread.join();
      
  6. CountDownLatch

    • 用于使一个或多个线程等待直到在其他线程中执行的一组操作完成。
    • 示例:
      CountDownLatch latch = new CountDownLatch(1);
      latch.await(); // 等待
      latch.countDown(); // 计数减一
      
  7. CyclicBarrier

    • 允许一组线程互相等待,直到到达某个公共屏障点。
    • 示例:
      CyclicBarrier barrier = new CyclicBarrier(3);
      barrier.await(); // 等待其他线程
      

线程调度相关的方法

  1. Thread.sleep(long millis)

    • 使当前线程暂停执行指定的时间。
    • 示例:
      Thread.sleep(1000); // 暂停1秒
      
  2. Thread.yield()

    • 使当前线程放弃CPU的使用权,允许其他线程执行。
    • 示例:
      Thread.yield();
      
  3. Thread.setPriority(int newPriority)

    • 设置线程的优先级,优先级范围为1到10。
    • 示例:
      thread.setPriority(Thread.MAX_PRIORITY);
      
  4. Thread.getPriority()

    • 获取线程的优先级。
    • 示例:
      int priority = thread.getPriority();
      
  5. Executor框架

    • java.util.concurrent包中的Executor框架提供了线程池和任务调度的功能。
    • 示例:
      ExecutorService executor = Executors.newFixedThreadPool(10);
      executor.submit(() -> {
          // 任务代码
      });
      
  6. ScheduledExecutorService

    • 用于定时任务的调度。
    • 示例:
      ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
      scheduler.schedule(() -> {
          // 定时任务
      }, 5, TimeUnit.SECONDS);
      

这些方法和概念是Java多线程编程中常用的工具,理解它们的使用场景和原理对于编写高效、安全的多线程程序至关重要。