
如果 程序中创建了大量的生命期很短的线程 ,应该 使用线程池(thread pool) 。一个线程池中包含许多准备运行的空线程。将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。
另一个使用线程池的理由是减少并发线程的数目 。 创建大量线程会大大降低性能甚至使虚拟机崩溃 。如果有一个会创建许多线程的算法, 应该使用一个线程数“固定的”线程池 以限制并发线程的总数。
执行器(Executor)类有许多静态工厂方法用来构建线程池。
上面3个方法返回实现了ExecutorService接口 的 ThreadPoolExecutor类的对象 。
可以使用下面的方法 将一个Runnable对象或Callable对象提交给ExecutorService :
该线程池会在方便的时候尽早执行提交的任务。 调用submit时 , 会得到一个Future对象 ,可用来查询该任务的状态。
第一个submit方法返回一个Future<?>。可以使用这样一个对象来调用isDone、cancel或isCancelled。但是,get方法在完成的时候只是简单地返回null。
第二版本的Submit也提交一个Runnable,并且Future的get方法在完成的时候返回指定的result对象。
第三个版本的Submit提交一个Callable,并且返回的Future对象将在计算结构准备好的时候得到它。
当用完一个线程池的时候,调用shutdown 。该方法 启动该池的关闭序列 。被关闭的执行器 不再接受新的任务 。当 所有任务都完成以后,线程池中的线程死亡 。另一种方法是调用 shutdownNow 。该池 取消尚未开始的所有任务并试图中断正在运行的线程 。
总结在使用线程池时应该做的事:
继续以一个计算匹配的文件数目程序为例:
ScheduledExecutorService接口 具有 为预定执行 (Scheduled Execution)或 重复执行任务而设计 的方法。它是一种允许使用线程池机制的java.util.Timer的泛化。Executors类的 newScheduledThreadPool 和 newSingleThreadScheduledExecutor方法 将返回实现了ScheduledExecutorService接口的对象。
可以预定Runnable或Callable在初始的延迟之后只运行一次。也可以预定一个Runnable对象周期性地运行。详见API。
在我的 多进程 multiprocessing.Process 有同学留言 如何获取 子进程处理的结果 。这里开一篇博客讲解。
其实这里涉及到 同步 与 异步 的概念。对于多线程/进程 而言,它们其实是一种 异步 *** 作。
对于异步 *** 作,分为 不需要获取异步结果 与 需要获取异步结果 ,我们应该尽量设计成第一种方式。
对于大部分的 多线程/进程 | 异步 *** 作 [ 后面统称为异步 *** 作 ],我们应尽量在 异步 *** 作 中完成所有任务,这是可以通过设计控制的。
举例几个场景:
2)多个 线程/进程 | 异步 有关联的 *** 作。
多线程 / 进程有一个经典的入门案例:生产者与消费者模式。
按照同步的思想,应该是[ 在主控程序中 ]通过生产者获取数据,然后调用消费者去消耗数据。
但是在 多线程 |进程 中,我们应该在子线程中完成任务。所以应该这样设计:
在 生产者 与 消费者 中分别传入一个容器,他们分别在容器中 put , get 数据
小结,对于大部分的 IO *** 作,使用 多线程/进程 可以大大的减少程序执行时间,在设计 多线程/进程 时,我们应尽量将任务在 子线程/进程 中完成。
作为一个成熟的子线程/进程,你应该能够独立完成工作。包含数据处理,存储,异常等待。
一个子线程处理的任务量可大可小。我们可以通过一个子线程发送邮件,对服务器而言,可以通过一个子线程去处理用户请求,我们后端的所以 *** 作都是在这个子线程中完成。
虽然上面讲了很多的不需要获取异步结果的案例。当我们也有很多必须要获取异步结果的场景。
比如我们将一个很大的计算分成多个小计算,然后对这些小计算的结果汇总。
比如做大文件上传,将大文件拆分成小文件,并获取上传成功的小文件标示 ...
对于需要获取异步结果场景, python 有单独的 多线程/进程执行器 ,分别是
ProcessPoolExecutor , ThreadPoolExecutor
答案是C。两者主要在是否受CP控制、是否有时钟以及是否是用同一个时钟脉冲信号等三方面存在区别。
一、是否受CP控制
同步触发器:同步触发器受CP控制。
异步触发器:异步触发器不受CP控制。
二、是否有时钟
同步触发器:同步触发器有时钟。
异步触发器:异步触发器没有时钟。
三、是否是用同一个时钟脉冲信号
同步触发器:多个触发器用同一个时钟脉冲信号。
异步触发器:多个触发器用不同的时钟脉冲信号。
扩展资料
与常规RS触发器相比,同步RS触发器多出一个端子,称为时钟信号输入端支结构可以使同步RS触发器根据时钟脉冲时序改变输出状态。
当输入端(S、R)状态发生变化.同时只有时钟信号输入端有方波信号时,同步RS触发器状态才会发生改变。即在时钟脉冲下降沿时,触发器才会按照输入状态改变输出状态,反之亦然。
异步触发器是最常用的一种触发器。
UpdatePanel的每个子控件默认都是一个异步触发器。这说明,与这些控件交互所导致的回送会替换为异步回送,将要求UpdatePanel渲染其内容。
AsyncPostBackTrigger有两个属性。第一个属性是ControlID,这是产生事件的控件的ID。第二个属性EventName可选,可以想见,这是导致异步回送的控件事件的事件名称。
如果EventName未初始化,默认为控件最常见的事件(例如,对于按钮控件则是click事件)。
参考资料来源:百度百科-同步RS触发器
参考资料来源:百度百科-异步触发器
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)