`
tianhewulei
  • 浏览: 24542 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

关于一个主线程管理多个子线程

阅读更多
项目在进行多线程操作的时候,时常会碰到在一个主线程下要调用多个子线程的问题,如果调度保证这些线程不会打架很让人伤神,在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多线程编程、主线程与子线程交互数据

    本文将深入探讨QT多线程编程的核心概念,主线程与子线程之间的数据交互以及如何在VS2017中进行实际应用。 首先,理解QT中的线程模型至关重要。在QT中,主线程通常负责用户界面的更新和事件处理,而子线程则可以执行...

    java多线程编程 在主线程main中创建两个子线程

    自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...

    Java简单实现“主线程等待所有子线程完成再继续”

    此外,`CountDownLatch`是另一种常用于同步多个线程的工具,它可以计数线程的完成情况。当计数到达零时,所有等待的线程都会被释放。`CyclicBarrier`则允许一组线程等待其他线程到达一个公共屏障点,而`Semaphore`则...

    C# 主线程显示数据,子线程获取数据

    在Winform应用中,我们可以创建一个新的后台线程(子线程)来执行数据获取任务,同时确保主线程保持响应,更新UI。以下是一般的步骤: 1. **定义异步方法**:首先,你需要定义一个返回`Task`的异步方法,用于执行...

    子线程更新主线程数据

    线程安全是指当多个线程访问一个对象时,如果不用考虑线程的调度顺序,程序都能正常工作,那么这个对象就是线程安全的。在Java或iOS等平台中,线程安全主要通过锁机制、信号量、条件变量等方式实现。在Android中,...

    如何从子线程更新主线程数据

    在多线程编程中,尤其是使用VC++进行开发时,如何有效地从子线程更新主线程的数据是一个重要的问题。这涉及到线程间通信(Thread Communication)的概念,它确保了不同线程之间的协作和数据同步。在Windows环境中,...

    Unity异步线程调用主线程脚本

    Unity异步线程调用主线程脚本程序,在Unity中异步线程调用主线程会报错,所以编写了一个Loom

    有关主线程和子线程

    根据给定文件的信息,我们可以提炼出以下关于主线程与子线程的相关知识点: ### 主线程与子线程概述 1. **程序**: 指的是安装在移动设备(如iOS设备)上的每一个应用程序。 2. **进程**: 正在运行的每一个应用程序...

    主线程等待子线程结束

    对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。 也就是说,需要在主线程开启子多线程后,直到子线程全部执行结束为止,回到主线程。

    qt 多线程 防止主线程做循环操作导致界面假死

    例如,定义一个信号`emit newDataAvailable(data)`,在子线程的循环操作中发出,主线程连接该信号并更新界面。 4. 安全退出子线程 当不再需要子线程时,不要直接调用`thread.quit()`或`thread.terminate()`,这些...

    Java主线程等待子线程执行完毕

    CountDownLatch 是一个同步辅助类,它允许一个或多个线程等待某些操作的完成。它的主要作用是将一个计数器初始化为某个值,然后在每个线程执行完毕时将计数器减一,当计数器减到零时,等待的线程将被唤醒。 在上面...

    C#子线程执行完后通知主线程的方法

    在C#编程中,多线程是常见的并发执行方式,其中主线程通常负责应用程序的主逻辑,而子线程则可以执行一些独立的任务。当子线程完成其工作后,有时需要通知主线程以便进行下一步操作。本文将详细介绍如何在C#中实现...

    Qt主线程与次线程通信实例代码

    在"ThreadTest"这个压缩包中,可能包含了一个或多个示例程序,演示了如何在Qt主线程和次线程之间进行通信。这些示例可能包括: - 一个主窗口类,它在主线程中创建并显示UI。 - 一个自定义的QThread子类,定义了次...

    如何从子线程更新主线程数据实例C#.net源代码编写

    在子线程中,我们模拟了一个耗时操作,然后使用`Invoke`方法将UI更新委托给主线程。`delegate`关键字用于创建一个匿名方法,它将设置`label1`的文本。 对于WPF,代码会稍有不同,因为它使用Dispatcher对象: ```...

    android 主线程给子线程发送消息

    本示例"android 主线程给子线程发送消息"是通过`Handler`机制来实现通信的,这是一个关键的多线程同步技术。 `Handler`是Android中用于在线程间传递消息和调度任务的工具,尤其是主线程与工作线程之间的通信。下面...

    主线程和工作线程相互之间的通信示例程序

    在多线程编程中,线程间的通信是一个关键的概念,特别是在复杂的系统中,主线程与工作线程的协作是确保程序高效、稳定运行的基础。本文将深入探讨标题和描述所提及的“主线程和工作线程相互之间的通信示例程序”,并...

    主线程等待子多线程(无结果返回)执行完成再继续执行

    线程池可以更好地管理线程资源,而异步操作允许主线程在等待子任务时进行其他工作。 **5. 监视器和锁(Monitor and Locks)** 在更复杂的场景下,可以使用监视器(如Java的`synchronized`关键字,C#'s `lock`语句)...

    主线程等待子线程结束代码

    我在工作的过程中遇到一个问题,需要主线程等等所有子线程执行完后再做某件事情,在网上找了很多代码,都没有真正解决这个问题. 现在我解决了这个问题,把代码共享出来供大家参考. 代码中有注释和注意事项,相信大家看过...

    java 子线程通过观察者模式通知主线程

    主线程作为观察者,注册到这个`Observable`对象上,当子线程发出通知时,主线程的`update()`方法会被调用,从而实现通信。 4. **示例代码**:以下是一个简单的例子,演示了如何使用观察者模式来实现子线程通知主线...

Global site tag (gtag.js) - Google Analytics