线程——自定义多线程task
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp7
{
public class TaskManage
{
public int maxcount;
public int countnum = 0;
public TaskManage(int worknum)
{
maxcount = worknum;
}
public void Run(Action< object> func, object s)
{
while (countnum >= maxcount)
{
Thread.Sleep(5);
}
lock (this)
{
countnum++;
}
Task task = new Task(() =>
{
func(s);
lock (this)
{
countnum--;
}
});
task.Start();
}
public void WaitComplete()
{
while (countnum > 0)
{
Console.WriteLine("***************"+countnum);
Thread.Sleep(5);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApp7
{
public class WorkBackground
{
public delegate void BackgroundMethod(params object[] objs);
private int threadCount = 0;
private int MaxThreadCount = 0;
public WorkBackground(int maxThreadCount)
{
MaxThreadCount = maxThreadCount;
}
public void Run(BackgroundMethod backgroundMethod, params object[] objs)
{
while (threadCount >= MaxThreadCount)
{ Thread.Sleep(5); }
lock (this) { threadCount++; }
Thread thread = new Thread((object threadObj) =>
{
if (threadObj as object[] != null)
{ backgroundMethod(threadObj as object[]); }
else
{ backgroundMethod(); }
lock (this) { threadCount--; }
});
thread.IsBackground = true;
thread.Start(objs);
}
public void WaitComplete()
{
while (threadCount > 0)
{ Thread.Sleep(5); }
}
}
}
调用
//第一种
//TaskManage taskManage = new TaskManage(5);
//for (int i = 0; i < 10000; i++)
//{
// taskManage.Run(delegate (object[] s)
// {
// Console.WriteLine("s:" + s);
// }, i);
//}
//taskManage.WaitComplete();
//Console.ReadKey();
//第二种
WorkBackground taskManage = new WorkBackground(5);
for (int i = 0; i < 10000; i++)
{
taskManage.Run(delegate (object[] s)
{
Console.WriteLine("s:" + s[0]);
}, i);
}
taskManage.WaitComplete();
Console.ReadKey();
线程——自定义多线程task的更多相关文章
- C#中的线程(下)-多线程
1. 单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它 ...
- 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程
额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...
- C# 多线程task
1.异步和多线程的区别?没什么太大区别.异步是目的,使用多线程实现.想想AJAX异步加载,不就是不想让浏览器界面卡住嘛,所以在程序中对于某些单独的操作,比如写日志,我们不想等它完成后再执行其它操作(因 ...
- Java线程和多线程(一)——线程的基本概念
Java 线程是一个轻量级执行任务的处理单元.Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务. 在应用中存在两种类型的线程,用户线程和守护线程.当我们启动应 ...
- python——线程与多线程基础
我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...
- 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...
- Java多线程父子线程关系 多线程中篇(六)
有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...
- java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...
- C#多线程编程(1)--线程,线程池和Task
新开了一个多线程编程系列,该系列主要讲解C#中的多线程编程. 利用多线程的目的有2个: 一是防止UI线程被耗时的程序占用,导致界面卡顿:二是能够利用多核CPU的资源,提高运行效率. 我没有进行很 ...
随机推荐
- Python爬虫【实战篇】scrapy 框架爬取某招聘网存入mongodb
创建项目 scrapy startproject zhaoping 创建爬虫 cd zhaoping scrapy genspider hr zhaopingwang.com 目录结构 items.p ...
- sprintboot 中占位符及多环境配置
(原) 关于springboot中多环境配置问题 1.在application.properties文件中通过 spring.profiles.active=... 选择系统所要加载的配置文件,这里的 ...
- jcrop2.X 取消选框
(原) 官网 0.9.12 API 2.X API 在2.X以下在版本中,api提供了release()方法用于取消选框.但在2.X以上的版本中已经没有这个方法了.于是各种查找,终于解决了如何取消选框 ...
- [C#6] 8-异常增强
0. 目录 C#6 新增特性目录 1. 在catch和finally块中使用await 在C#5中引入一对关键字await/async,用来支持新的异步编程模型,使的C#的异步编程模型进一步的简化(A ...
- CSS有哪些引入方式,link和@import的区别
3种方式哦,行内样式.内部样式表.外部样式表 1. 行内样式又称为内联样式,直接在HTML标签的style属性中添加css. 会导致 HTML 代码变得冗长 2. 内部样式表又称为嵌入方式,是在HTM ...
- spring boot中配置日志log和热部署
Java的日志有很多 个人强烈不推荐log4j ,推荐log4j2和logback 在高并发,多线程的环境下log4j1 的性能和log4j2相比可以用junk来形容 对就是junk.log4j2的 ...
- 消息中间件 MQ
复制粘贴于:https://blog.csdn.net/wqc19920906/article/details/82193316 一.消息中间件相关知识 1.概述 消息队列已经逐渐成为企业IT系统内部 ...
- OpenStack端口(15)
一.OpenStack组件使用的默认端口号 openstack openstack service default ports port type keystone Identity service ...
- Error:Failed to resolve: com.android.support.constraint:constraint-layout:1.0.2
可以换个maven库: allprojects { repositories { jcenter() //maven { url "https://jitpack.io" } ma ...
- 关于ES6
一.变量声明const和let 变量提升:在ES6之前,我们都是用var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部).这就是函数变量提升例如: fu ...