zoukankan
html css js c++ java
今天写信息采集小程序时实现程序中同时只允许5个线程运行
/**/
/*
************************************
* CopyRight (c) edzh.com
* Date --> 2006-1-25
* Coder --> yesun
************************************
*/
using
System;
using
System.Drawing;
using
System.Collections;
using
System.ComponentModel;
using
System.Windows.Forms;
using
System.Data;
using
System.IO;
using
System.Net;
using
System.Text.RegularExpressions;
using
System.Web;
using
System.Threading;
using
System.Xml;
namespace
TestThread
{
/**/
///
<summary>
///
Form1 的摘要说明。
///
</summary>
public
class
Form1 : System.Windows.Forms.Form
{
//
多线程,只允许5个线程同时进行
public
static
int
maxThreadCount
=
4
;
public
static
int
currentThreadCount
=
0
;
public
static
int
intCurrentThread
=
0
;
public
Thread[] thread
=
new
Thread[
100
];
//
20s判断一次当前线程数
private
System.Timers.Timer runable_Timer
=
new
System.Timers.Timer(
20
*
1000
);
/**/
///
<summary>
///
必需的设计器变量。
///
</summary>
private
System.ComponentModel.Container components
=
null
;
public
Form1()
{
//
//
Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
//
TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/**/
///
<summary>
///
清理所有正在使用的资源。
///
</summary>
protected
override
void
Dispose(
bool
disposing )
{
if
( disposing )
{
if
(components
!=
null
)
{
components.Dispose();
}
}
base
.Dispose( disposing );
}
Windows 窗体设计器生成的代码
#region
Windows 窗体设计器生成的代码
/**/
///
<summary>
///
设计器支持所需的方法 - 不要使用代码编辑器修改
///
此方法的内容。
///
</summary>
private
void
InitializeComponent()
{
}
#endregion
/**/
///
<summary>
///
应用程序的主入口点。
///
</summary>
[STAThread]
static
void
Main()
{
Application.Run(
new
Form1());
}
/**/
///
<summary>
///
开始抓取
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void
btnStrat_Click(
object
sender, System.EventArgs e)
{
//
正在初始化线程
for
(
int
i
=
1
;i
<=
100
;i
++
)
{
GetArticle ga
=
new
GetArticle();
//
传入相关参数
ga.url
=
txtUrl.Text.Replace(
"
@pageid
"
,i.ToString());
//
把线程加入到数组中。。
Thread th
=
new
Thread(
new
ThreadStart(ga.strat));
thread[tempInt
++
]
=
th;
}
//
"共"+tempInt+"个线程保存队列中,正在启动线程,请稍候
";
//
声明委托
runable_Timer.Elapsed
+=
new
System.Timers.ElapsedEventHandler(timer_CheckThread);
runable_Timer.Start();
}
void
timer_CheckThread(
object
sender, System.Timers.ElapsedEventArgs e)
{
System.Timers.Timer initTimer
=
(System.Timers.Timer)sender;
initTimer.Stop();
//
判断当前线程数,如果不足5个,则Join新的线程
if
(currentThreadCount
<
maxThreadCount)
{
//
表示当前线程可以加入线程,使得总执行线程为5个
try
{
if
(intCurrentThread
<=
100
&&
thread[intCurrentThread]
!=
null
&&
thread[intCurrentThread].ThreadState
==
ThreadState.Unstarted)
{
thread[intCurrentThread].Priority
=
ThreadPriority.Lowest;
currentThreadCount
++
;
thread[intCurrentThread].Name
=
"
线程#
"
+
(intCurrentThread
+
1
);
//
this.errorMsg.Text = thread[intCurrentThread].Name+"已开始执行
";
thread[intCurrentThread].Start();
//
当前线程数+1
intCurrentThread
++
;
}
}
catch
{
}
}
initTimer.Interval
=
3
*
1000
;
initTimer.Start();
}
}
/**/
///
<summary>
///
抓取文章类
///
</summary>
public
class
GetArticle
{
/**/
///
<summary>
///
开始抓取数据
///
</summary>
///
<param name="url">
网址
</param>
///
<param name="reg">
正则表达式
</param>
///
<returns></returns>
public
void
strat()
{
//
Do Something。。。
//
执行完毕,减小当前线程数
//
this.parentForm.currentThreadCount--;
Form1.currentThreadCount
--
;
//
this.parentForm.errorMsg.Text = Thread.CurrentThread.Name+" 执行完毕!";
}
}
查看全文
相关阅读:
我的友情链接
我的友情链接
我的友情链接
我的友情链接
我的友情链接
我的友情链接
我的友情链接
以太坊设计与实现:数据结构与对象-账户
以太坊设计与实现:数据结构与对象-创世区块与配置分析
以太坊设计与实现:数据结构与对象-链配置
原文地址:https://www.cnblogs.com/yesun/p/356841.html
最新文章
数据库学习第二季第三集:各种编程语言从数据库中获得数据方式小结
数据库学习第二季第三集:各种编程语言从数据库中获得数据方式小结
我的友情链接
我的友情链接
我的友情链接
我的友情链接
我的友情链接
如何打开EPUB文件
Uncaught SyntaxError: Inline Babel script: Adjacent JSX elements must be wrapped in an enclosing tag
css
热门文章
css
MySQL精选 | 枚举类型ENUM的DDL变更测试
点开瞅瞅,再来几道Python面试题吧,Python面试题No20
以太坊:理解ERC-20 token合约
以太坊设计与实现:数据结构与对象-交易与签名
以太坊设计与实现:数据结构与对象-交易
以太坊设计与实现:数据结构与对象-Gas
我的友情链接
我的友情链接
我的友情链接
Copyright © 2011-2022 走看看