1. 程式人生 > >Java中五種執行緒池的介紹

Java中五種執行緒池的介紹

如果不希望任務在佇列中等待而是希望將任務直接移交給工作執行緒,可使用SynchronousQueue作為等待佇列。SynchronousQueue不是一個真正的佇列,而是一種執行緒之間移交的機制。要將一個元素放入SynchronousQueue中,必須有另一個執行緒正在等待接收這個元素。只有在使用無界執行緒池或者有飽和策略時才建議使用該佇列。

建立執行緒池的5種方式(jdk1.8之後加了一種)

public class Test {

	public static void main(String[] args) {

		//1.建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
		ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
		for (int i = 0; i < 10; i++) {
			int index = i;
			try {
				Thread.sleep(i * 500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			cachedThreadPool.execute(new Runnable() {

				@Override
				public void run() {
					System.out.println("index: " + index);

				}
			});
		}

		
		//2.建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待
		ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
		for (int i = 0; i < 10; i++) {
			int index = i;
			fixedThreadPool.execute(new Runnable() {

				@Override
				public void run() {
					try {
						Thread.sleep(1000);
						System.out.println("index: " + index);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			});

		}

		
		//3.建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行
		ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
		for (int i = 0; i < 10; i++) {
			final int index = i;
			singleThreadPool.execute(new Runnable() {

				@Override
				public void run() {
					try {
						System.out.println(index);
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}

				}
			});
		}

		
		//4.建立一個定長執行緒池,支援定時及週期性任務執行
		ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(0);

		// 第二個引數代表:初始延時多久
		// 第三個引數代表:週期的間隔
		// 第四個引數代表:時間的單位
		scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

			@Override
			public void run() {
				System.out.println("delay 1 seconds, and excute every 3 seconds");
			}
		}, 1, 3, TimeUnit.SECONDS);

		scheduledThreadPool.shutdown();

		//5.newWorkStealingPool建立一個擁有多個任務佇列(以便減少連線數)的執行緒池
		//1.8的新特性
		ExecutorService newWorkStealingPool = Executors.newWorkStealingPool();

		List<Callable<String>> callables = Arrays.asList(
				callable("task1", 1),
				callable("task2", 2),
				callable("task3", 3));

		try {
			//單個執行執行緒
			String result = newWorkStealingPool.invokeAny(callables);
			System.out.println(result);
			
			//執行全部
			List<Future<String>> all = newWorkStealingPool.invokeAll(callables);
			//future是一個介面,有幾個方法:boolean cancel(boolean mayInterruptIfRunning);
			//boolean isCancelled();
			//boolean isDone();
			//V get() throws InterruptedException, ExecutionException;
			//V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
			for (Future<String> future : all) {
				String f = future.get();
				System.out.println(f);
			}

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	static Callable<String> callable(String result, long sleepSeconds) {
	    return () -> {
	        TimeUnit.SECONDS.sleep(sleepSeconds);
	        return result;
	    };
	}


}