服务器对每个client都分配一个线程,但如果为每个来的client都分配一个线程,太多线程,开销太大了,因此服务器利用固定个数的线程交替的和每个client交互。Java5提供了线程池,供我们直接使用。做服务器经常用到!!
1固定线程池
class ThreadPoolTest{
main(){
ExecutorService pool=Executors .newFixedThreadPool(3);创建固定三个线程的线程池
pool.execute(new Runnable(){run(){print(Thread.getCurentThread().getName())}});
往线程池里扔进去一个任务,让3个线程,随机一个线程去执行。
如果扔10个任务
for(i<10){pool.execute(new Runnable(){run(){print(Thread.getCurentThread().getName())}});
会先去执行先扔进去的3个任务,只能同时执行3个任务,且每个任务都要互斥执行完,不能被打断,执行完的线程执行下一个任务。就像客服一样!
pool.shutdown();当任务执行完,线程都空闲时,消除所有线程。
pool.shutdownNow();强制马上消除所有线程
}}}
2缓存线程池(不固定个数)
ExecutorService pool=Executors.newCachedThreadPool();
默认放几个任务就先开几个线程,当任务数大于线程数的时候,就增加新的线程,保证每个任务都有线程,当线程wait超时后,线程回收结束。
3单线程池
ExecutorService pool=Executors.newSingleThreadExecutor();
永远保证一个线程,当一个线程死后,后立即启动新的一个线程。
4定时线程:让线程隔一段时间再去执行任务
1 ExecutorService pool=Executors.newScheduledThreadPool(3).schedule(
new Runnbale(){run(){}},10,TimeUnit.SECOND)
有三个参数:第一个是任务,第二个是时间,第三个是 时间单位
10秒后,三个线程才去执行任务
2 ExecutorService pool=Executors.newScheduledThreadPool(3).scheduleAtFixedRate(
new Runnbale(){run(){}},10,2,TimeUnit.SECOND)
先10秒后,执行任务,以后每隔2秒执行一次任务
3 没有指定日期data的定时:如今晚3点
schedule(new Runnbale{run(){}},data.getTime()-System.currentTimeMillis(),TimeUnit.SECOND)
转化为相隔的秒数 |
|