您好,登录后才能下订单哦!
ExecutorService
是 Java 并发包 java.util.concurrent
中的一个接口,它提供了一种将任务提交给一组线程执行的方式。ExecutorService
管理线程的方式主要包括以下几个方面:
ExecutorService
通常与线程池一起使用,线程池是一组预先创建的线程,可以重复使用这些线程来执行多个任务。这样可以减少线程创建和销毁的开销,提高系统性能。
Executors.newFixedThreadPool(int nThreads)
创建一个固定大小的线程池。这个线程池中的线程数量是固定的,当所有线程都在忙时,新提交的任务会被放入队列中等待。Executors.newCachedThreadPool()
创建一个可缓存的线程池。这个线程池会根据需要创建新线程,并在一段时间内重用空闲线程。Executors.newSingleThreadExecutor()
创建一个单线程的执行器。这个执行器保证所有任务按照提交的顺序依次执行。通过 ExecutorService
提交任务的方式主要有两种:
execute(Runnable command)
:提交一个 Runnable
任务,不返回任何结果。submit(Callable<T> task)
:提交一个 Callable
任务,返回一个 Future<T>
对象,可以通过这个对象获取任务的执行结果。当线程池中的线程都在忙时,新提交的任务会被放入一个任务队列中等待。ExecutorService
默认使用的是 LinkedBlockingQueue
,这是一个无界队列,可以容纳任意数量的任务。如果需要限制任务队列的大小,可以使用 ArrayBlockingQueue
或其他有界队列。
当不再需要 ExecutorService
时,应该调用 shutdown()
或 shutdownNow()
方法来关闭线程池:
shutdown()
:平滑地关闭线程池,不再接受新的任务,但会等待已经提交的任务执行完毕。shutdownNow()
:立即关闭线程池,尝试停止所有正在执行的任务,并返回等待执行的任务列表。ExecutorService
提供了一些方法来监控和管理线程池的状态:
getActiveCount()
:返回正在执行任务的线程的大概数量。getCompletedTaskCount()
:返回已经执行完毕的任务的大概总数。getTaskCount()
:返回曾经提交给线程池的任务总数。isShutdown()
:判断线程池是否已经关闭。isTerminated()
:判断线程池是否已经终止。以下是一个简单的示例,展示了如何使用 ExecutorService
来管理线程:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorServiceExample {
public static void main(String[] args) {
// 创建一个固定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);
// 提交任务
for (int i = 0; i < 10; i++) {
final int taskNumber = i;
executorService.submit(() -> {
System.out.println("Task " + taskNumber + " is running on thread " + Thread.currentThread().getName());
try {
Thread.sleep(1000); // 模拟任务执行时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task " + taskNumber + " is completed");
});
}
// 关闭线程池
executorService.shutdown();
}
}
在这个示例中,我们创建了一个固定大小为3的线程池,并提交了10个任务。每个任务会打印自己的编号和执行的线程名称,然后休眠1秒钟,最后打印任务完成的消息。最后,我们调用 shutdown()
方法来关闭线程池。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。