必威体育Betway必威体育官网
当前位置:首页 > IT技术

Thread、ThreadPool

时间:2019-09-01 18:41:10来源:IT技术作者:seo实验室小编阅读:72次「手机版」
 

threadpool

Thread、ThreadPool

同步编程与异步编程

同步编程:在没有使用线程的情况下,我们编写的代码都是顺序执行的,都是在主线程上执行。

异步编程:通过使用线程,实现同时进行多个任务,主线程执行的同时,线程执行其他任务。

1、Thread

 var thread = new Thread(ThreadMethod);
 //thread.isbackground = false;
 //thread.IsBackground = true;
 thread.Start();

thread默认实例化创建的是前台线程,如果显示的设置IsBackground为true则该线程为后台线程

前台线程与后台线程的区别:

前后台线程示例图

前台线程:前台线程会影响进程的关闭(当我们关闭主线程的时候,如果前台线程没有执行完,进程不会被关闭)

后台线程:后台线程不会影响进程的关闭(当我们关闭主线程的时候,无论后台线程是否执行完毕,进行直接关闭)

如上图示例所示,如果thread.IsBackground=false时,点击button1开始执行10秒的任务,在任务没执行完时关闭窗体,form关闭了,但是进程中的进程testForm要等待前台线程执行完后才会消失。

如果thread.IsBackground=true时,点击button1开始执行10秒的任务,在任务没执行完时关闭窗体,窗体关闭且进程testForm也随之关闭。

2、ThreadPool

使用Thread进行多线程开发时候有这样一种情况,当需要执行的任务很多,一个任务一个Thread,那么就会创建过多的Thread,也可能导致服务或应用程序直接奔溃无法运行,除非你很好的对Thread进行管理、销毁等。

ThreadPool是微软提供的一个线程资源池、管理池。

1.减少在创建和销毁线程上所花的时间以及系统资源的开销

2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。

使用方法

static void Main(string[] args)
{
     console.WriteLine("主线程开始");

      var callBack = new WaitCallback(DoSomething);
      var param = "a";
      ThreadPool.queueuserworkitem(callBack, param);

      Console.WriteLine("主线程结束!");
      Console.ReadLine();
}

private static void DoSomething(object param)
{
       //do something
       for (var i = 1; i <= 10; i++)
       {
           Console.WriteLine("执行次数{0}", i);
           Thread.Sleep(1000);
        }
}

使用ThreadPool

ThreadPool有两种类别的线程,一种是辅助线程,一种是I/O线程

下面代码通过异步写入文件数据实现线程池IO线程使用

static void Main(string[] args)
{
       int maxCount,maxIOCount = 0;
       ThreadPool.GetAvailableThreads(out maxCount, out maxIOCount);
       Console.WriteLine("辅助线程个数:{0},IO线程个数{1}", maxCount, maxIOCount);
       var stream = new filestream("D://test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 1024, true);
       var bf = Encoding.UTF8.GetBytes("啦啦啦德玛西亚");
       stream.BeginWrite(bf, 0, bf.Length, new AsyncCallback(CallBackMethod), stream);
       Console.ReadLine();
}

private static void CallBackMethod(IAsyncResult param)
{
       int maxCount, maxIOCount = 0;
       ThreadPool.GetAvailableThreads(out maxCount, out maxIOCount);
       Console.WriteLine("辅助线程个数:{0},IO线程个数{1}", maxCount, maxIOCount);

    var stream = param.AsyncState as FileStream;
    stream.EndWrite(param);
    stream.Flush();
    stream.Close();
}

异步写文件使用的是线程池中的IO线程

相关阅读

Java线程休眠Thread.sleep()(2)

源地址 https://www.journaldev.com/1020/thread-sleep-java  作者 Pankaj Java中Thread.sleepThread.sleep()方法能够已毫秒为

Thread的setPriority()设置优先级源代码分析(5)

接上一篇:Thread的SetDeamon()守护线程源代码分析(4) 我们知道线程在执行start()之后,如果没有cpu执行权的话,它是在runnable状态,而

Pthread使用总结

摘要 最近由于开发需要用到多线程,以前看的ARTOOKIT项目中有用到pthread,所以又重新看了一下,重点分析了它的多线程实现。它的实现

Thread.join()

线程A的run方法中调用了线程B的join,此时线程A处于阻塞状态,直到线程B执行完毕或者死亡的时候,线程A才会继续执行。

UNIX(编程-线程控制):02---线程创建属性(pthread_attr

一、线程属性结构体(pthread_attr_t) 此结构的内容包含的就是线程的属性值 线程创建函数pthread_create的参数2就是使用此结构为

分享到:

栏目导航

推荐阅读

热门阅读