业务功能:没人时多人同时来电,使用线程池创建线程,调用实时转录接口,将对应文本存入数据库
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorExample {
private static ThreadLocal<String> textThreadLocal = new ThreadLocal<>();
public static void main(String[] args) {
int corePoolSize = 5; // 核心线程数
int maxPoolSize = 8; // 最大线程数
long keepAliveTime = 10; // 线程空闲时间
TimeUnit unit = TimeUnit.SECONDS; // 空闲时间单位
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, maxPoolSize, keepAliveTime, unit,
new ArrayBlockingQueue<>(10) // 任务队列
);
// 提交任务给线程池执行
executor.execute(() -> {
// 监听电话
String translatedText = translatePhoneCall(callNumber);
textThreadLocal.set(translatedText);
//存储逻辑
});
// 关闭线程池
executor.shutdown();
}
private static String translatePhoneCall(int callNumber) {
// 模拟电话接听和翻译的过程
String callText = "This is the text for call " + callNumber;
String translatedText = "Translated text for call " + callNumber;
// 其他翻译逻辑...
return translatedText;
}
}
使用ThreadPoolExcutor创建了线程池。对电话进行监听,有电话接入首先判断线程池里的核心线程是否都在执行任务,如果不是则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队 列里。如果工作队列满了,则判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任 务。如果已经满了,则交给拒绝策略来处理这个任务。
在每个电话的处理过程中,我们调用translatePhoneCall()方法模拟电话的接听和翻译过程,然后将翻译后的文本存储在textThreadLocal中。最后,存储到数据库。
ThreadLocal用于在每个线程中存储独立的变量副本,这样每个线程都可以独立地访问和修改自己的变量副本,而不会相互干扰。