/* * $HeadURL: https://springside.googlecode.com/svn/springside3/trunk/modules/core/src/test/java/org/springside/modules/unit/utils/ThreadUtilsTest.java $ * $Id: ThreadUtilsTest.java 1213 2010-09-11 16:28:22Z calvinxiu $ * Copyright (c) 2010 by Ericsson, all rights reserved. */ package org.springside.modules.unit.utils; import static org.junit.Assert.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springside.modules.log.MockLog4jAppender; import org.springside.modules.utils.ThreadUtils; import org.springside.modules.utils.ThreadUtils.CustomizableThreadFactory; public class ThreadUtilsTest { @Test public void customizableThreadFactory() { Runnable runnable = new Runnable() { @Override public void run() { } }; CustomizableThreadFactory factory = new CustomizableThreadFactory("foo"); Thread thread = factory.newThread(runnable); assertEquals("foo-1", thread.getName()); Thread thread2 = factory.newThread(runnable); assertEquals("foo-2", thread2.getName()); } @Test public void gracefulShutdown() throws InterruptedException { Logger logger = LoggerFactory.getLogger("test"); MockLog4jAppender appender = new MockLog4jAppender(); appender.addToLogger("test"); //time enough to shutdown ExecutorService pool = Executors.newSingleThreadExecutor(); Runnable task = new Task(logger, 500, 0); pool.execute(task); ThreadUtils.gracefulShutdown(pool, 1000, 1000, TimeUnit.MILLISECONDS); assertTrue(pool.isTerminated()); assertNull(appender.getFirstLog()); //time not enough to shutdown,call shutdownNow appender.clearLogs(); pool = Executors.newSingleThreadExecutor(); task = new Task(logger, 1000, 0); pool.execute(task); ThreadUtils.gracefulShutdown(pool, 500, 1000, TimeUnit.MILLISECONDS); assertTrue(pool.isTerminated()); assertEquals("InterruptedException", appender.getFirstLog().getMessage()); //self thread interrupt while calling gracefulShutdown appender.clearLogs(); final ExecutorService self = Executors.newSingleThreadExecutor(); task = new Task(logger, 100000, 0); self.execute(task); final CountDownLatch lock = new CountDownLatch(1); Thread thread = new Thread(new Runnable() { @Override public void run() { lock.countDown(); ThreadUtils.gracefulShutdown(self, 200000, 200000, TimeUnit.MILLISECONDS); } }); thread.start(); lock.await(); thread.interrupt(); ThreadUtils.sleep(500); assertEquals("InterruptedException", appender.getFirstLog().getMessage()); } @Test public void normalShutdown() throws InterruptedException { Logger logger = LoggerFactory.getLogger("test"); MockLog4jAppender appender = new MockLog4jAppender(); appender.addToLogger("test"); //time not enough to shutdown,write error log. appender.clearLogs(); ExecutorService pool = Executors.newSingleThreadExecutor(); Runnable task = new Task(logger, 1000, 0); pool.execute(task); ThreadUtils.normalShutdown(pool, 500, TimeUnit.MILLISECONDS); assertTrue(pool.isTerminated()); assertEquals("InterruptedException", appender.getFirstLog().getMessage()); //self thread interrupt while calling shutdown appender.clearLogs(); final ExecutorService selfpool = Executors.newSingleThreadExecutor(); task = new Task(logger, 100000, 1000); selfpool.execute(task); final CountDownLatch lock = new CountDownLatch(1); Thread thread = new Thread(new Runnable() { @Override public void run() { lock.countDown(); ThreadUtils.normalShutdown(selfpool, 200000, TimeUnit.MILLISECONDS); } }); thread.start(); lock.await(); thread.interrupt(); ThreadUtils.sleep(1000); assertEquals("InterruptedException", appender.getFirstLog().getMessage()); } static class Task implements Runnable { private Logger logger; private int runTime = 0; private int sleepTime; Task(Logger logger, int sleepTime, int runTime) { this.logger = logger; this.sleepTime = sleepTime; this.runTime = runTime; } @Override public void run() { System.out.println("start task"); if (runTime > 0) { long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < runTime) { } } try { Thread.sleep(sleepTime); } catch (InterruptedException e) { logger.warn("InterruptedException"); } } } }