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+" 执行完毕!";
}
}
查看全文
相关阅读:
没有技术驱动型公司 | 每个人都得加班 | 关注软技能
各种15min(启动、横盘、破位)样例
最新win10教育版激活密匙 win10各版本永久激活序列号
大数定律具体是个什么概念?
统计与概率——马同学高等数学
三星MagicInfo Express软件制作介绍
!!网上找的【英语单词词根记忆顺口溜】
一个故事轻松记忆常见252个英语字根
分享一个开源的音频分析软件
C#连接XAMPP中的mysql 数据库(windows)
原文地址:https://www.cnblogs.com/yesun/p/356841.html
最新文章
常用的MySQL优化操作
SQL Server 2012自动标识列值跳转问题
常用SQL Server进行性能优化语句
开源项目QRCoder介绍
如何使CEF支持Flash
开源项目Humanizer介绍
.NET 开源项目 Polly 介绍
The PARADOX File Structure
修改Nuget默认包存放位置
PORTABLE CD PLAYERS COMPONENTS COMPOSITION
热门文章
暴力破解算法(Brute Force)
GOOGLE 人机验证(RECAPTCHA)无法显示解决方案(转)
Live2D的使用
FTP协议的主动模式和被动模式的区别
疫情之下,使用FRP实现内网穿透,远程连接公司电脑进行办公
SQL Server无备份误删数据的恢复
查询数据库各种历史记录
SQL Server 数据库清空ldf日志文件
Navicat Keygen
使用Navicat Keygen激活(破解)Navicat Premium 12
Copyright © 2011-2022 走看看