C# 使用多线程

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值