首页 > 编程知识 正文

java四种线程池,javaspring

时间:2023-05-06 14:31:46 阅读:42541 作者:2009

让我们从入门开始看Java的同时编程吧。

本文主要介绍如何创建线程以及如何管理线程池。 在Java语言中,最简单的线程类似于以下代码:

Runnable runnable=new Runnable (

公共void run (}

system.out.println('run );

}

}

可以从以下代码行启动此线程:

newthread(runnable ).start );

这已经是一个很简单的例子,但是如果有很多需要长时间运行的任务同时运行,等待所有这些线程运行,然后试图获得返回值,这就有点困难了。 但是,Java已经有了解决方案。 那是执行程序。 可以在简单的类中创建线程池和线程工厂。

线程池是使用类ExecutorService的实例表示的,可以使用ExecutorService发送任务并执行计划的运行。 列出可以从Executors类创建的几种线程池类型。

因为Single Thread Executor:只有一个线程线程池,所以所有提交的任务都将按顺序执行。 代码: executors.newsinglethreadexecutor (

Cached Thread Pool:线程池中有许多线程需要同时运行。 旧的可用线程将由新任务重新运行。 如果线程未运行超过60秒,它将退出并从池中删除。 代码: Executors.newCachedThreadPool (

固定线程池:具有固定线程数,如果没有任务执行,线程将继续等待。 代码: Executors.newFixedThreadPool (

线程池,代码: executors.newscheduledthreadpool (),Scheduled Thread Pool:用于调度即将执行的任务

Single Thread Scheduled Pool:只有一个线程用于调度未来任务的执行。 代码: executors.newsinglethreadscheduledexecutor (

创建线程池后,可以通过多种方式将执行任务发送到池。 将Runnable或Callable发送到线程池时,Future实例表示任务状态,而发送Runnable时,Future对象在任务完成后返回null。

例如,创建以下调用:

privatefinalclassstringtaskextendscallable {

公共字符串调用

//long操作

返回'运行';

}

}

如果使用四个线程执行此任务10次,则代码如下所示:

executorservicepool=executors.newfixedthreadpool (4;

for(intI=0; i 10; I ) {

pool.submit (新字符串任务) );

}

但是,必须手动关闭线程池以终止所有池中的线程:

pool.shutdown (;

否则,JVM不会关闭这些线程; 此外,如果使用shutdownNow ()方法强制关闭线程池,则正在运行的线程也将中断,所有尚未运行的任务也将不再运行。

但是在本例中,由于无法获取任务的执行状态,因此必须使用Future对象。

executorservicepool=executors.newfixedthreadpool (4;

列表futures=new ArrayList (10;

for(intI=0; i 10; I ) {

futures.add(pool.submit ) new字符串任务();

}

for(futurefuture:futures ) {

String result=future.get (;

//Compute the result

}

pool.shutdown (;

但是这个代码有点复杂,有不足的地方。 如果执行第一个任务需要很长时间,而其他任务完成得更早,当前线程将无法在第一个任务完成之前获得执行结果,但不要担心。 Java为您提供解决方案——完成服务。

一个完成服务是简化等待任务的执行结果的服务。 实现的类是ExecutorCompletionService,该类基于ExecutorService,因此请尝试以下代码:

executorservicethreadpool=executors.newfixedthreadpool (4;

completionservicepool=newexecutorcompletionservice (thread pool );

for(intI=0; i 10; I ) {

pool.submit (新字符串任务) );

}

for(intI=0; i 10; I ) {

String result=pool.take ().get );

//Compute the result

}

threadPool.shutdown (;

使用此代码,可以按照执行完成的顺序获取相应的结果,而不必维护Future对象的集合。

这就是这篇文章的全部。 Java提供的各种工具使多任务编程变得简单。 通过使用Executors、ExecutorService和CompletionService等工具类,可以创建复杂的并行任务执行算法并轻松更改线程数。

我希望这篇短文有助于你对同时编程的理解。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。