当前位置: 代码迷 >> 综合 >> C# 使用多线程
  详细解决方案

C# 使用多线程

热度:53   发布时间:2023-10-26 17:00:44.0

1.开启一个线程

Thread myThread=new Thread(new ThreadStart(method));myThread.Start(); 

2.开启一个线程执行一个带参数的方法

         sendData data = new sendData();data.pusherKey = "TA_BALANCE_DELIVERY_" + strTANO;data.requestStyle = "Post";data.strData = strData;Thread thread = new Thread(new ParameterizedThreadStart(pusher.exec));thread.Start((object) data);public void exec(Object obj){sendData data =obj as sendData;logger.Info(String.Format("当前PushKey:{0},当前时间{1}", data.pusherKey,DateTime.Now));Thread.Sleep(300000);exec(data.pusherKey, data.requestStyle, data.strData);}public class sendData{public string pusherKey { get; set; }public string requestStyle { get; set; }public string strData { get; set; }}

这里应注意的是,两边引用的sendData一定要是同一个,不然会转换失败‘

3.使用线程池管理线程

                    sendData data = new sendData();data.pusherKey = "TA_BALANCE_DELIVERY_" + strTANO;data.requestStyle = "Post";data.strData = strData;ThreadPool.SetMaxThreads(8,50);ThreadPool.QueueUserWorkItem(new WaitCallback(pusher.exec), data);public void exec(Object obj){sendData data =obj as sendData;logger.Info(String.Format("当前PushKey:{0},当前时间{1}", data.pusherKey,DateTime.Now));Thread.Sleep(300000);exec(data.pusherKey, data.requestStyle, data.strData);}public class sendData{public string pusherKey { get; set; }public string requestStyle { get; set; }public string strData { get; set; }}

同理,两边引用的sendData仍然要是同一个。

这里的功能就是使exec发放延迟五分钟执行。但是使用线程池的话,受到线程数量的限制,线程较多的话会影响执行时间,其实开启几百个新线程是完全没问题的。

GetAvailableThreads(OUT A,OUT B)    剩余空闲线程数,这里返回的是1000,是不是意味着一个线程池默认可用线程是1000个,如果有知道的麻烦告知。
GetMaxThreads(OUT A,OUT B)    最多可用线程数,所有大于此数目的请求将保持排队状态,直到线程池线程变为可用
GetMinThreads(OUT A,OUT B)    检索线程池在新请求预测中维护的空闲线程数
QueueUserWorkItem    启动线程池里得一个线程(队列的方式,如线程池暂时没空闲线程,则进入队列排队)
SetMaxThreads    设置线程池中的最大线程数
SetMinThreads    设置线程池最少需要保留的线程数

4.sleep和wait的区别

线程主要有以下几种状态:可运行,运行,阻塞,死亡。

sleep是让线程休眠,到时间后会继续执行;wait是等待,需要唤醒执行。

使用方面:
从使用的角度来看sleep方法是Thread线程类的方法,而wait是Object顶级类的方法。
sleep可以在任何地方使用,而wait只能在同步方法和同步块中使用。
CPU及锁资源释放:
sleep、wait调用后都会暂停当前线程并让出CPU的执行时间,但不同的是sleep不会释放当前持有对象的锁资源,到时间后会继续执行,而wait会释放所有的锁并需要notify / notifyAll 后重新获取到对象资源后才能继续执行。
异常捕获方面:
sleep需要捕获或者抛出异常,而wait/notify/notifyAll则不需要。

sleep(1000)和wait(1000)的区别:

     Thread.Sleep(1000) 意思是在未来的1000毫秒内本线程不参与CPU竞争,1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。

    wait(1000)表示将锁释放1000毫秒,到时间后如果锁没有被其他线程占用,则再次得到锁,然后wait方法结束,执行后面的代码,如果锁被其他线程占用,则等待其他线程释放锁。注意,设置了超时时间的wait方法一旦过了超时时间,并不需要其他线程执行notify也能自动解除阻塞,但是如果没设置超时时间的wait方法必须等待其他线程执行notify。

  相关解决方案