Java并发编程:理解Executor、Executors与ExecutorService

版权申诉
0 下载量 51 浏览量 更新于2024-08-08 收藏 39KB DOCX 举报
"本文档主要探讨Java并发编程中的Executor、Executors和ExecutorService的概念及其使用。Executor是一个接口,用于执行Runnable任务,而ExecutorService是Executor的一个子接口,提供了更多的生命周期管理和任务跟踪功能。" 在Java并发编程中,Executor框架是一个重要的工具,它简化了线程管理和任务调度。Executor接口定义了一个单一的方法`execute(Runnable command)`,用于执行给定的Runnable任务。这个方法的引入避免了程序员需要直接创建和管理线程,而是将线程的创建和管理交给了Executor,提高了代码的可维护性和灵活性。 ExecutorService是Executor接口的一个扩展,它提供了一系列额外的方法来控制Executor的生命周期和管理任务的执行状态。例如,`shutdown()`方法允许平滑地关闭ExecutorService,不再接受新的任务,并等待已提交任务的完成。这种方式确保正在执行的任务能够正常结束,而不会被突然中断。`isDone()`方法可以用来检查Future任务是否已经完成,`get()`方法用于获取任务的执行结果,如果任务尚未完成,`get()`会阻塞直到结果可用。此外,`submit()`方法用于提交任务并返回一个Future,这样可以追踪任务的状态,甚至在必要时取消任务。 ExecutorService还支持Callable任务,Callable任务与Runnable类似,但可以返回一个结果。通过`submit(Callable<T> task)`方法提交Callable任务,返回的Future对象可以使用`get()`方法获取计算结果。如果需要取消任务,可以调用Future的`cancel(boolean mayInterruptIfRunning)`方法,参数表示是否允许立即中断任务。 在实际开发中,通常使用Executors类来创建ExecutorService实例。Executors提供了多种工厂方法,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`创建一个缓存线程池,它会根据需要创建新线程,而当线程空闲时间过长则会被回收。 总结来说,Executor和ExecutorService是Java并发编程的核心组件,它们为开发者提供了方便的方式来组织并发任务,管理线程池,以及控制任务的执行流程。通过使用这些工具,开发者可以更加专注于业务逻辑,而不是底层的线程管理,从而提高代码的可读性和可维护性。

D:\javaJDK17\bin\java.exe "-javaagent:D:\编程软件\idea2022\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=4912:D:\编程软件\idea2022\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA java\javaWeb\Maven\maven-project01\target\classes;D:\Maven\apache-maven-3.9.3-bin\apache-maven-3.9.3\mvn_store\org\mybatis\mybatis\3.5.5\mybatis-3.5.5.jar;D:\Maven\apache-maven-3.9.3-bin\apache-maven-3.9.3\mvn_store\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;D:\Maven\apache-maven-3.9.3-bin\apache-maven-3.9.3\mvn_store\org\slf4j\slf4j-api\1.7.32\slf4j-api-1.7.32.jar;D:\Maven\apache-maven-3.9.3-bin\apache-maven-3.9.3\mvn_store\ch\qos\logback\logback-core\1.2.6\logback-core-1.2.6.jar;D:\Maven\apache-maven-3.9.3-bin\apache-maven-3.9.3\mvn_store\ch\qos\logback\logback-classic\1.2.6\logback-classic-1.2.6.jar" Demo1.HelloWord Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${com.mysql.jdbc.Driver} ### The error may exist in UserMapper.xml ### The error may involve test.selectAll ### The error occurred while executing a query ### Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${com.mysql.jdbc.Driver} at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:135) at Demo1.HelloWord.main(HelloWord.java:23) Caused by: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${com.mysql.jdbc.Driver} at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.initializeDriver(UnpooledDataSource.java:244) at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:223) at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:219) at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.getConnection(UnpooledDataSource.java:95) at org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:432) at org.apache.ibatis.datasource.pooled.PooledDataSource.getConnection(PooledDataSource.java:89) at org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:139) at org.apache.ibatis.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:61) at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:337) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ... 3 more

2023-07-22 上传