C# 线程池执行操作例子

public partial class Form1 : Form
    {
        CountdownEvent hander = new CountdownEvent(10);

        public static object lock_action = new object();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(Run1), i);
            }
            textBox1.Invoke(new Action(() =>
            {
                textBox1.AppendText("按钮1执行完毕".Log());
            }));
        }
        private void button2_Click(object sender, EventArgs e)
        {

            //ThreadPool.SetMaxThreads(10, 30);
            for (int i = 0; i < 10; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(Run2), i);
            }
            hander.Wait();
            textBox1.AppendText("按钮2执行完毕".Log());
        }

        private void Run1(object str)
        {
            Thread.Sleep(1000);
            textBox1.AppendText(str.ToString().Log());
        }
        private void Run2(object str)
        {
            Thread.Sleep(1000);
            textBox1.AppendText(str.ToString().Log());
            hander.Signal();
        }

    }
时间: 2024-07-31 06:11:37

C# 线程池执行操作例子的相关文章

线程池---骚操作

线程池 效果对比 普通线程的启动方式 利用线程池启动线程的方式 线程池简介 降低资源消耗:不用频繁创建销毁资源. 提高响应速度 提高线程可管理性 简单线程池的设计 设计思路 设计过程中需要思考的问题 初始创建线程数 没有可用线程的解决策略 缓冲数组长度 缓冲数组满了怎么办? 线程池的核心参数 corePoolSize maxiumPoolSize keepAliveTime unit workQueue threadFactory handle 线程池的处理流程 阻塞队列 无界队列(链表) 有界

多线程之美4一 线程池执行原理浅析

目录结构 引言 一.线程池工作流程图 二.线程池的运行原理 三.线程池的7个参数 四.常用4个阻塞队列 五.四个拒绝策略语义以及测试用例 六.Executors工具类 6.1. Executors提供的三种线程池 6.2 实际开发中应该怎样设定合适线程池? 七.线程池提交任务的2种 八.总结 引言 ? 我们为什么要使用线程池,它可以给我们带来什么好处?要想合理使用线程池,我们需要对线程池的工作原理有深入的理解和认识,让我们一起来看看吧. 好处: ? 1.处理响应快,不用每次任务到达,都需要等待初

捕获Java线程池执行任务抛出的异常

Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { public abstract void run();} 那么如果 run() 方法中抛出了RuntimeException,将会怎么处理了? 通常java.lang.Thread对象运行设置一个默认的异常处理方法: java.lang.Thread.setDefaultUncaughtExceptionHandler(UncaughtExce

Delphi动态链接多个数据源执行操作例子

1.首先配置文件[SubExamDep1]DBSERVER=(local)DBNAME=herpeisweixinUSERNAME=saPWD=bjbrMSG=SubExamDep1失败[SubExamDep2]DBSERVER=(local)DBNAME=herpeisFZTJUSERNAME=saPWD=bjbrMSG=SubExamDep2失败2.工程文件加入 Inifiles 文件public:MyIni :Tinifile; glAppPath :string;create 事件增加g

如何接收线程池执行后的返回值

时间紧迫,先简单记一下 首先定义一个返回值的接受类 package com.lz.car.facade.dto; import java.io.Serializable; import com.fasterxml.jackson.annotation.JsonIgnore; public class MessageDto implements Serializable{ /** * 接口返回内容 */ private static final long serialVersionUID = 84

ThreadPoolExecutor线程池和ProcessPoolExecutor进程池

ProcessPoolExecutor线程池 1.为什么需要线程池呢,如果创建了20个线程,而同时只允许3个线程在运行,但是20个线程都需要创建和销毁,线程的创建是需要消耗系统资源的,所以线程池的思想就是:每个线程各分配一个任务,剩下的任务皮队等待,当某个线程完成了任务的时候,排队任务就可以安排给这个线程继续执行 2.标准库concurrent.futures模块,它提供了 ProcessPoolExecutor和ThreadPoolExecutor两个类,实现了对threading和multi

戏(细)说Executor框架线程池任务执行全过程(下)

上一篇文章中通过引入的一个例子介绍了在Executor框架下,提交一个任务的过程,这个过程就像我们老大的老大要找个老大来执行一个任务那样简单.并通过剖析ExecutorService的一种经典实现ThreadPoolExecutor来分析接收任务的主要逻辑,发现ThreadPoolExecutor的工作思路和我们带项目的老大的工作思路完全一致.在本文中我们将继续后面的步骤,着重描述下任务执行的过程和任务执行结果获取的过程.会很容易发现,这个过程我们更加熟悉,因为正是每天我们工作的过程.除了Thr

线程池的基础与操作

一.概念 使用ThreadPoolExecutor类:包含了五个参数int corePoolSize(线程池的基本大小),int maximumPoolSize(最大线程池容量),long keepAliveTime(存活时间),TimeUnit unit(时间单位), BlockingQueue<Runnable> workQueue(任务队列) corePoolSize:当线程池刚刚创建的时候,线程池中没用线程,当有任务创建且当前线程数小于corePoolSize时才会去创建新的线程.但是

线程池的执行流程

合理使用线程池能够带来3个好处: 1)降低资源消耗:2)提高响应速度:3)提高线程的可管理性. 那么线程池是如何工作的呢,借用并发编程艺术一书中的话来描述当一个任务提交给线程池之后,线程池会怎么做? 首先,线程池会判断核心线程池里的线程(线程总数是30,则coreSize有可能是10)是否都在执行任务.如果没有比方说当前只有9个线程在工作,则从核心线程池中创建一个新的线程来执行任务.如果当前已经有10个线程在工作了,则进入下一步: 其次,线程池会判断工作队列是否已经满了,如果工作队列没有满,则将