问题遇到的现象和发生背景
想使用异步线程去调用数据库(mybatis连接)并更改数据
问题相关代码,请勿粘贴截图
private static SqlSession sqlSession;
private static InputStream in;
private static ThreadLocal<DateFormat> dateThreadLocal = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
}
};
static {
try {
in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
sqlSession = sessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testUpdate(){
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> {
try {
System.out.println("进入了缓存线程池中!~");
Date date = dateThreadLocal.get().parse("2022-3-5 23:56:27");
Emp emp = new Emp();
emp.setName("王老七");
emp.setUpdate_time(date);
int row = sqlSession.update("EmpMapper.update", emp);
sqlSession.commit();
System.out.println("更新成功! 影响行数: " + row);
sqlSession.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
});
运行结果及报错内容
控制台只打印了System.out.println("进入了缓存线程池中!~");并没有报错信息,断点跟到System.out.println("进入了缓存线程池中!~");再下一步就直接结束运行了
根据log查看到:
java.util.concurrent.TimeoutException
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204)
at com.intellij.debugger.impl.attach.JavaAttachDebuggerProvider.getProcessAttachInfo(JavaAttachDebuggerProvider.java:213)
at com.intellij.debugger.impl.attach.JavaAttachDebuggerProvider.getAttachInfo(JavaAttachDebuggerProvider.java:173)
at com.intellij.debugger.impl.attach.JavaAttachDebuggerProvider.getProcessAttachInfo(JavaAttachDebuggerProvider.java:227)
at com.intellij.debugger.impl.attach.JavaDebuggerAttachUtil.canAttach(JavaDebuggerAttachUtil.java:21)
at com.intellij.execution.impl.DefaultJavaProgramRunner$AttachDebuggerAction$1.lambda$startNotified$0(DefaultJavaProgramRunner.java:289)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:224)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
我的解答思路和尝试过的方法
只要把上面的代码注掉 ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> { });
直接运行就可以执行成功