项目在进行多线程操作的时候,时常会碰到在一个主线程下要调用多个子线程的问题,如果调度保证这些线程不会打架很让人伤神,在JDK API中发现了这么个专门用来管理线程的接口,java.util.concurrent.ExecutorService。
以下是api的描述
public interface ExecutorServiceextends Executor
Executor 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。
可以关闭 ExecutorService,这将导致其停止接受新任务。关闭后,执行程序将最后终止,这时没有任务在执行,也没有任务在等待执行,并且无法提交新任务。
通过创建并返回一个可用于取消执行和/或等待完成的 Future,方法 submit 扩展了基本方法 Executor.execute(java.lang.Runnable)。方法 invokeAny 和 invokeAll 是批量执行的最常用形式,它们执行任务集合,然后等待至少一个,或全部任务完成(可使用 ExecutorCompletionService 类来编写这些方法的自定义变体)。
Executors 类提供了用于此包中所提供的执行程序服务的工厂方法。
用法示例
下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 Executors.newFixedThreadPool(int) 工厂方法:
class NetworkService {
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize) throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}
public void serve() {
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request
}
}
一个简单的线程池调度,让java自己本身去管理这种调度中可能会出现的问题。
分享到:
相关推荐
主线程是程序的入口点,而子线程是由主线程创建的辅助线程。子线程的运行结果可以通过阻塞的方式来获取。在 Java 中,我们可以使用 Callable 或 Runnable 接口来实现子线程的创建和执行。 其中,Callable 接口的 ...
本文将深入探讨QT多线程编程的核心概念,主线程与子线程之间的数据交互以及如何在VS2017中进行实际应用。 首先,理解QT中的线程模型至关重要。在QT中,主线程通常负责用户界面的更新和事件处理,而子线程则可以执行...
自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...
此外,`CountDownLatch`是另一种常用于同步多个线程的工具,它可以计数线程的完成情况。当计数到达零时,所有等待的线程都会被释放。`CyclicBarrier`则允许一组线程等待其他线程到达一个公共屏障点,而`Semaphore`则...
在Winform应用中,我们可以创建一个新的后台线程(子线程)来执行数据获取任务,同时确保主线程保持响应,更新UI。以下是一般的步骤: 1. **定义异步方法**:首先,你需要定义一个返回`Task`的异步方法,用于执行...
线程安全是指当多个线程访问一个对象时,如果不用考虑线程的调度顺序,程序都能正常工作,那么这个对象就是线程安全的。在Java或iOS等平台中,线程安全主要通过锁机制、信号量、条件变量等方式实现。在Android中,...
在多线程编程中,尤其是使用VC++进行开发时,如何有效地从子线程更新主线程的数据是一个重要的问题。这涉及到线程间通信(Thread Communication)的概念,它确保了不同线程之间的协作和数据同步。在Windows环境中,...
Unity异步线程调用主线程脚本程序,在Unity中异步线程调用主线程会报错,所以编写了一个Loom
根据给定文件的信息,我们可以提炼出以下关于主线程与子线程的相关知识点: ### 主线程与子线程概述 1. **程序**: 指的是安装在移动设备(如iOS设备)上的每一个应用程序。 2. **进程**: 正在运行的每一个应用程序...
对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。 也就是说,需要在主线程开启子多线程后,直到子线程全部执行结束为止,回到主线程。
例如,定义一个信号`emit newDataAvailable(data)`,在子线程的循环操作中发出,主线程连接该信号并更新界面。 4. 安全退出子线程 当不再需要子线程时,不要直接调用`thread.quit()`或`thread.terminate()`,这些...
CountDownLatch 是一个同步辅助类,它允许一个或多个线程等待某些操作的完成。它的主要作用是将一个计数器初始化为某个值,然后在每个线程执行完毕时将计数器减一,当计数器减到零时,等待的线程将被唤醒。 在上面...
在C#编程中,多线程是常见的并发执行方式,其中主线程通常负责应用程序的主逻辑,而子线程则可以执行一些独立的任务。当子线程完成其工作后,有时需要通知主线程以便进行下一步操作。本文将详细介绍如何在C#中实现...
在"ThreadTest"这个压缩包中,可能包含了一个或多个示例程序,演示了如何在Qt主线程和次线程之间进行通信。这些示例可能包括: - 一个主窗口类,它在主线程中创建并显示UI。 - 一个自定义的QThread子类,定义了次...
在子线程中,我们模拟了一个耗时操作,然后使用`Invoke`方法将UI更新委托给主线程。`delegate`关键字用于创建一个匿名方法,它将设置`label1`的文本。 对于WPF,代码会稍有不同,因为它使用Dispatcher对象: ```...
本示例"android 主线程给子线程发送消息"是通过`Handler`机制来实现通信的,这是一个关键的多线程同步技术。 `Handler`是Android中用于在线程间传递消息和调度任务的工具,尤其是主线程与工作线程之间的通信。下面...
在多线程编程中,线程间的通信是一个关键的概念,特别是在复杂的系统中,主线程与工作线程的协作是确保程序高效、稳定运行的基础。本文将深入探讨标题和描述所提及的“主线程和工作线程相互之间的通信示例程序”,并...
线程池可以更好地管理线程资源,而异步操作允许主线程在等待子任务时进行其他工作。 **5. 监视器和锁(Monitor and Locks)** 在更复杂的场景下,可以使用监视器(如Java的`synchronized`关键字,C#'s `lock`语句)...
我在工作的过程中遇到一个问题,需要主线程等等所有子线程执行完后再做某件事情,在网上找了很多代码,都没有真正解决这个问题. 现在我解决了这个问题,把代码共享出来供大家参考. 代码中有注释和注意事项,相信大家看过...
主线程作为观察者,注册到这个`Observable`对象上,当子线程发出通知时,主线程的`update()`方法会被调用,从而实现通信。 4. **示例代码**:以下是一个简单的例子,演示了如何使用观察者模式来实现子线程通知主线...