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的更多相关文章

  1. C#中的线程(下)-多线程

    1.  单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它 ...

  2. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...

  3. C# 多线程task

    1.异步和多线程的区别?没什么太大区别.异步是目的,使用多线程实现.想想AJAX异步加载,不就是不想让浏览器界面卡住嘛,所以在程序中对于某些单独的操作,比如写日志,我们不想等它完成后再执行其它操作(因 ...

  4. Java线程和多线程(一)——线程的基本概念

    Java 线程是一个轻量级执行任务的处理单元.Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务. 在应用中存在两种类型的线程,用户线程和守护线程.当我们启动应 ...

  5. python——线程与多线程基础

    我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...

  6. 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析

    首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...

  7. Java多线程父子线程关系 多线程中篇(六)

    有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...

  8. java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)

    今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...

  9. C#多线程编程(1)--线程,线程池和Task

    新开了一个多线程编程系列,该系列主要讲解C#中的多线程编程.    利用多线程的目的有2个: 一是防止UI线程被耗时的程序占用,导致界面卡顿:二是能够利用多核CPU的资源,提高运行效率. 我没有进行很 ...

随机推荐

  1. JavaScript 最终将在编程语言中占统治地位?

    JavaScript 最终将在编程语言中占统治地位? JavaScript 现在是大多数开发者都会使用的编程语言.网络效应会推动它成为有史以来第一个真正占统治地位的编程语言吗? 大约十年前,编程的方式 ...

  2. js实现搜索记录列表

    <div class="sy_div28"> <div class="sy_div23"> <span>搜索历史</s ...

  3. 逆向学习-Upack的PE文见头分析

    重叠文件头 MZ文件头与PE文件头重叠. offest 0 e_magic:magic number = 4D5A('MZ') offest 3C  e_lfanew:File address of ...

  4. .NET、PHP、MySql、JS中的时间戳你每次是手写还是复制?这篇文章让你一次性搞懂

    什么是时间戳(chuō)? 答:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. 为什么时间戳要从1970年01月0 ...

  5. 增强for

    什么是增强for? 增强for(也称之为for each)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的.他的内部原理其实是一个Iterator迭代器,所以在遍历过程中不能对集合 ...

  6. 记录一次无厘头的粗心失误——java后台报错:Unknown column 'xxx' in 'field list'

    原因: sql文件马虎,直接用错了仓库.用的不是程序调用的仓库.而自己pojo和mapper还是采用Mybatis的逆向工程生成的.当时搞得很无厘头. 解决方案: sql用到程序指定的仓库就行啦. 总 ...

  7. c++ 套路多

    1. 浅拷贝带来的多次析构问题 参见:https://www.cnblogs.com/33debug/p/6657730.html 解决方案,深拷贝.强烈建议自定义拷贝构造函数为深拷贝,否则可能会给自 ...

  8. Java 静态内部类的加载时机

    参考文章:[https://www.cnblogs.com/maohuidong/p/7843807.html] 前言: 在看单例模式的时候,在网上找帖子看见其中有一种(IoDH) 实现单例的方式,其 ...

  9. Activiti6-FormService(学习笔记)重要

    设置流程定义文件: <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns=&qu ...

  10. jQuery在页面加载的时候自动调用某个函数的方法

    第一种:$(document).ready(function(){ func(xxx)//执行函数}); 第二种:$(function(){ func(xxx)//执行函数}); 第三种:jQuery ...