Java review--线程池

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/successA/article/details/52888977


为什么要使用线程池?

  主要是因为线程在创建和销毁的时候开销比较大,创建线程池,可以让线程并发执行。如果线程的创建和销毁时间,跟线程之间切换时间差不多,也没有用线程池的必要。


线程池是什么?

  线程池是一种多线程处理机制,处理过程将任务添加到队列里面,然后创建线程后自动启动这些任务。


线程池由组成呢?

  线程池管理器(ThreadPoolManager):创建并管理线程池。

  工作线程(WorkThread):线程池中线程。

       任务接口(Task):每个任务必须实现的接口,已提供工作线程任务调度的执行。

  任务队列:用于存放没有处理的任务,提供一种缓冲机制。


线程池分类?

  jdk线程池主要分成四种,

  newCachedThreadPool:可缓存线程池,自行创建和回收线程。

  newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

  newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。

  newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。


项目经验

  在公司里面,经常用ScheduledThreadPool来做跑批的功能,比如对账、自动投标等功能,当然也可以使用Quartz框架。

  下面写一个ScheduledThreadPool的demo,简单介绍一下ScheduledThreadPool的使用。

package com.xm.hashmap;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledTest {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ScheduledExecutorService schedule=Executors.newScheduledThreadPool(2);
		
		
		/**
		 * 延迟1s执行一次任务
		 */
		schedule.schedule(new Runnable() {			
			@Override
			public void run() {
				System.out.println("hello world runnable");
				
			}
		}, 1000, TimeUnit.MILLISECONDS);
		
		/**
		 * 延迟2s执行一次任务
		 */
		Future result =schedule.schedule(new Callable<String>() {
			@Override
			public String call() throws Exception {
				return "hello world callable";
			}
				
		}, 100, TimeUnit.MILLISECONDS);
		
		System.out.println(result.get());
		
		
		/**
		 * 延迟,2s钟执行一次
		 */
		schedule.scheduleAtFixedRate(new Runnable() {			
			@Override
			public void run() {
				System.out.println("周期任务执行");
				
			}
		}, 1000, 2000, TimeUnit.MILLISECONDS);
		
		/**
		 * 延迟
		 */
		schedule.scheduleWithFixedDelay(new Runnable(){

			@Override
			public void run() {
				System.out.println("定时任务执行 ");
				
			}
			
		}, 1000, 3000, TimeUnit.MILLISECONDS);
		
		//关闭定时和周期任务的执行
		Thread.sleep(1000*10);
		schedule.shutdown();//平缓的关闭
		System.out.println("pool shutdown:"+schedule.isShutdown());
		
		while (!schedule.isTerminated()) {
			schedule.awaitTermination(1, TimeUnit.SECONDS);
			
		}
	}
}

结果图:




猜你喜欢

转载自blog.csdn.net/successA/article/details/52888977
今日推荐