让我们从入门开始看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等工具类,可以创建复杂的并行任务执行算法并轻松更改线程数。
我希望这篇短文有助于你对同时编程的理解。