线程池读取List<T>实例

private static readonly Object ThisLock = new object();
private static readonly AutoResetEvent AutoReset = new AutoResetEvent(false);
private static int _selectindex;
private const int Threadcount = 10;
private int _finishcount;
List<T> _datamodellist;

public void LoadPage()
{
    Grid();
}

private void Grid()
{   _list.Clear();
    _finishcount = 0;
    _selectindex = 0;
    _datamodellist = GetAll();
    for (var i = 0; i < Threadcount; i++)
    {
        var thread = new Thread(DoTask);
        thread.Start(1);
    }
    AutoReset.WaitOne();//等待线程池完成
    //do something
}

public void DoTask(Object index)
{
    while (_selectindex < _datamodellist.Count)
    {
        lock (ThisLock) //锁定后只有一个线程进入直至块内代码执行完
        {
            if (_selectindex >= _datamodellist.Count) continue;
            daimamodel = _datamodellist[_selectindex];
            _selectindex++;
        }
        //do something
        _finishcount++;
        if (_finishcount == _datamodellist.Count)
        {
            AutoReset.Set();//最后一个线程完成后才终止     }   } }
时间: 2024-10-10 12:45:47

线程池读取List<T>实例的相关文章

Java线程池详解及实例

前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory.即便没有这样的情况,大量的线程回收也会给GC带来很大的压力. 为了避免重复的创建线程,线程池的出现可以让线程进行复用.通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用. 接下来从总体到细致的方式,来共同探讨线程池. 总体的架构

线程池 API (转)

文档原始地址 目录 线程池概述 线程池对象 回调环境对象 工作对象 等待对象 计时器对象 I/O 完成对象 使用清理组简化清理 回调实例 API 随着 Windows Vista® 的发布和 Windows Server® 2008 的即将问世,Microsoft 为托管应用程序的开发人员提供了改进的 Windows® 平台,它包含多种新技术,使得令原本 Windows 开发人员从中受益的改进能被广为利用.例如,自从 Windows 2000 发布以来,已是该平台组成部分的线程池组件经历了一次完

使用线程池优化多线程编程

Java中的对象是使用new操作符创建的,如果创建大量短生命周期的对象,这种方式性能非常低下.为了解决这个问题,而发明了池技术. 对于数据库连接有连接池,对于线程则有线程池. 本实例介绍两种方式创建1000个短生命周期的线程,第一种是普通方式,第二种是线程池的方式.通过时间和内存消耗的对比,就可以很明显地看出线程池的优势. 实例结果如下: 说明:使用线程池创建对象的时间是15毫秒,说明线程池是非常高效的. 关键技术: Executors类为java.util.concurrent包中所定义的Ex

C# 线程池使用

使用C#线程池可以省去对线程的创建.销毁等操作,但是也不能很好的控制线程,这里是本人对线程池的理解,留下记录方便以后查询! 本DEMO用线程池多线程去读取Northwind所有表的数据与不用线程读取的时间差异 不用线程读取时间: 使用线程读取时间: 主要代码: 1 不使用线程读取代码: 1 private void button4_Click(object sender, EventArgs e) 2 { 3 if (listBox1.Items.Count > 0) 4 { 5 System.

diy数据库(七)--线程控制块、消息、线程池

一.概述 1.diy数据库使用的是一个多进程and多线程的服务器模型.每个进程作为一个节点实例,监听一个端口:而每个用户连接在数据库节点实例中都会有一个代理线程与之对应. 2.除了主线程外每个线程都有一个EDU(进程调度单元,也可称为线程控制块),另外每种系统线程类型有且只有一个线程实体(这里的系统线程只有一种,即监听线程,主线程不在线程管理池里面) 3.代理线程是专门处理用户请求的 ,由监听线程创建 4.线程池对进行调度,通过传入不同的类型, 内部调用不同的函数执行相应请求 5.EDU回池后可

Java线程-- 线程池

1.线程池概念 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源. 为什么要使用线程池? 在java中,如果每个请求到达就创建一个新线程,开销是相当大的.在实际使用中,创建和销毁线程花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多.除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源.如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不

Linux C++线程池实例

想做一个多线程服务器测试程序,因此参考了github的一些实例,然后自己动手写了类似来加深理解. 目前了解的线程池实现有2种思路: 第一种: 主进程创建一定数量的线程,并将其全部挂起,此时线程状态为idle,并将running态计数为0,等到任务可以执行了,就唤醒线程,此时线程状态为running,计数增加,如果计数达到最大线程数,就再创建一组空闲线程,等待新任务,上一组线程执行完退出,如此交替. 第二种: 采用生成者-消费者模式,主进程作为生成者,创建FIFO队列,在任务队列尾部添加任务,线程

java线程池实例

目的         了解线程池的知识后,写个线程池实例,熟悉多线程开发,建议看jdk线程池源码,跟大师比,才知道差距啊O(∩_∩)O 线程池类 1 package thread.pool2; 2 3 import java.util.LinkedList; 4 5 public class ThreadPool { 6 //最大线程数 7 private int maxCapacity; 8 //初始线程数 9 private int initCapacity; 10 //当前线程数 11 p

线程池实例:使用Executors和ThreadPoolExecutor

线程池负责管理工作线程,包含一个等待执行的任务队列.线程池的任务队列是一个Runnable集合,工作线程负责从任务队列中取出并执行Runnable对象. java.util.concurrent.executors 提供了 java.util.concurrent.executor 接口的一个Java实现,可以创建线程池.下面是一个简单示例: 首先创建一个Runable 类: WorkerThread.java package com.journaldev.threadpool; public