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。