任务列表分派给多个线程的策略及方法

多线程下载由来已久,如 FlashGet、NetAnts 等工具,它们都是依懒于 HTTP 协议的支持(Range 字段指定请求内容范围),首先能读取出请求内容 (即欲下载的文件) 的大小,划分出若干区块,把区块分段分发给每个线程去下载,线程从本段起始处下载数据及至段尾,多个线程下载的内容最终会写入到同一个文件中。

只研究有用的,工作中的需求:要把多个任务分派给多个线程去执行,这其中就会有一个任务列表指派到线程的策略思考:已知:1. 一个待执行的任务列表,2. 指定要启动的线程数;问题是:每个线程实际要执行哪些任务。

策略是:任务列表连续按线程数分段,先保证每线程平均能分配到的任务数,余下的任务从前至后依次附加到线程中--只是数量上,实际每个线程执行的任务都还是连续的。如果出现那种僧多(线程) 粥(任务) 少的情况,实际启动的线程数就等于任务数,一挑一。这里只实现了每个线程各扫自家门前雪,动作快的完成后眼见别的线程再累都是爱莫能助。

实现及演示代码如下:由三个类实现,写在了一个 java 文件中:TaskDistributor 为任务分发器,Task 为待执行的任务,WorkThread 为自定的工作线程。代码中运用了命令模式,如若能配以监听器,用上观察者模式来控制 UI 显示就更绝妙不过了,就能实现像下载中的区块着色跳跃的动感了,在此定义下一步的着眼点了。

代码中有较为详细的注释,看这些注释和执行结果就很容易理解的。main() 是测试方法

时间: 2024-10-06 14:05:11

任务列表分派给多个线程的策略及方法的相关文章

《BI项目笔记》增量ETL数据抽取的策略及方法

原文:<BI项目笔记>增量ETL数据抽取的策略及方法 增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将业务系统中的变化数据按一定的频率准确地捕获到:性能,不能对业务系统造成太大的压力,影响现有业务.目前增量数据抽取中常用的捕获变化数据的方法有:a.触发器:在要抽取的表上建立需要的触发器,一般要建立插入.修改.删除三个触发器,每当源表中的数据发生

借助封装类实现线程调用带参方法

(一).描述      由于线程只能执行无参数方法. 有时候需要线程执行"带参数方法"      此示例演示怎样借助封装类实现"线程调用带参方法"(二).代码 本示例代码已经测试,能够正常运行! (三).示例下载  http://www.cnblogs.com/Files/ChengKing/ThreadExample.rar using System;using System.Threading; namespace 借助封装类实现_线程调用带参方法_{ clas

win8.1在运行窗口输入gpedit.msc打不开组策略解决方法

  win8.1在运行窗口输入gpedit.msc打不开组策略解决方法 1.在此需要说明的一点是,对于核心版本的Win8.1系统,并没有提供"组策略编辑"程序.我们可以通过以下方法来查看自己的电脑中是否存在"GPEDIT.MSC"程序: 2.打开"运行"对话框(按Win+R可打开),输入"%SystemRoot% system32"并按回车; 3.进入该目录,查找是否存在"gpedit.msc"文件.如图,

停止Java线程,小心interrupt()方法

转自http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html  程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程.  背景      中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作.线程是死亡.还是等待新的任务或是继

Python提示[Errno 32]Broken pipe导致线程crash错误解决方法_python

本文实例讲述了Python提示[Errno 32]Broken pipe导致线程crash错误解决方法.分享给大家供大家参考.具体方法如下: 1. 错误现象ThreadingHTTPServer 实现的 http 服务,如果客户端在服务器返回前,主动断开连接,则服务器端会报 [Errno 32] Broken pipe 错,并导致处理线程 crash. 下面先看个例子,python 版本: 2.7 示例代码 复制代码 代码如下: #!/usr/bin/env python #!coding=ut

C++封装线程类的实现方法_C 语言

本文实例讲述了C++封装线程类的实现方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: // 给主窗口的通知消息  #define WM_CUTTERSTART WM_USER + 100    // wParam == xxx  lParam==xxxx    /*  外面调用这个类时,只需要IsRunning() Startxxx(xxx) Suspendxxx()   Resumexxx() Stopxxx()  */    /*  m_bContinue在真正的工作代码Do

安全专家详谈:对付恶意软件的策略及方法

[51CTO.com 专家特稿]恶意软件的设计目的是无需得到计算机所有者的明确同意即可渗透进入一台计算机系统,并实施破坏或进一步控制.恶意软件(malware)这个词来自于"恶意的(malicious)"和"软件(software)"的组合,计算机专家用这个词来意指多种敌意的.可 插入的.讨厌的软件或程序代码.恶意软件的危害恶意软件的最常见的传播途径是通过互联网.电子邮件.万维网等.它可以劫持浏览器.重定向搜索意图.提供令人厌恶的弹出式广告.跟踪用户所访问的网站等.

谁有多线程代码!!我想实现10个线程同时执行一个方法!

问题描述 我想10个线程同时执行一个方法,但是每个方法传入的参数是不一样的!我在网上找了些代码,但是不行,造成线程混乱,谁能教教我啊!!想要实现的是:10个线程同时去登陆网站,然后采集东西.当然我也有10个用户名.10个线程每个线程对应一个用户. 解决方案 解决方案二:分太少了.不然老夫贴出来解决方案三:ThreadPool.QueueUserWorkItem();解决方案四:给你个多线程的例子privatevoidbtnDataUp_Click(objectsender,RoutedEvent

回归测试的策略及方法

回归测试的策略及方法 业界的回归测试策略基本上有两种: ● 全部回归,也就是把之前的所有的测试用例,无论是手动的,还是自动的,全部跑一遍 ● 部分回归,定性分析代码改动有哪些影响,代码改动的文件/模块和其他的文件/模块的依赖性,然后选择被影响到的文件/模块相应的测试用例来跑一遍 第一种的好处就是,通过大量的跑测试用例,可以尽量多的发现哪些功能是否有被影响到,缺点就是如果你的测试用例库很大,那这个是相当消耗时间和人力的: 第二种的好处就是,不需要消耗大量的时间和人力,缺点就是因为是定性分析,所以有