MST

星途 面试题库

面试题:Java多线程中,如何精准控制线程从TIMED_WAITING状态转换回RUNNABLE状态且避免竞态条件?

假设你在开发一个多线程应用,部分线程处于TIMED_WAITING状态。现在需要将这些线程精准转换回RUNNABLE状态,同时要避免竞态条件。描述你的实现思路,并提供关键代码片段。
24.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用Condition接口Condition是在java.util.concurrent.locks包中,它提供了比传统Objectwaitnotify方法更灵活的线程间通信机制。
  2. 创建LockCondition实例:通过Lock创建对应的Condition,线程在需要进入TIMED_WAITING状态时,调用Conditionawait方法并设置等待时间。
  3. 唤醒特定线程:当需要将处于TIMED_WAITING状态的线程唤醒时,通过ConditionsignalsignalAll方法,同时利用Lock保证操作的原子性,避免竞态条件。

关键代码片段

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadStateTransition {
    private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();

    public void timedWait() {
        lock.lock();
        try {
            condition.await(5, java.util.concurrent.TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }

    public void signal() {
        lock.lock();
        try {
            condition.signal();
        } finally {
            lock.unlock();
        }
    }
}

在上述代码中:

  • timedWait方法中,线程获取lock后调用condition.await(5, TimeUnit.SECONDS)进入TIMED_WAITING状态,等待5秒或被其他线程唤醒。
  • signal方法获取lock后调用condition.signal唤醒一个等待在condition上的线程,确保操作的原子性,避免竞态条件。