本文內容介紹在使用Junit進行線程測試的時候出現的一個小問題,本身簡單作一個記錄,以便後續查看java
在使用java編寫多線程併發實驗程序時在Juint寫了測試程序,但並無獲得預想的效果。apache
直接上代碼多線程
線程類:併發
package sm.examples.threaddemo; import org.apache.log4j.Logger; public class Thread1 implements Runnable { private static final Logger logger = Logger.getLogger(Thread1.class); @Override public void run() { int i = 0; while (true) { logger.info("-----in while------" + i++); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (i == 50) { break; } } } }
測試類:
ide
package sm.test; import org.apache.log4j.Logger; import org.junit.Test; import sm.examples.threaddemo.Thread1; public class TestThreadDemo { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(TestThreadDemo.class); @Test public void test() { Thread1 thread1 = new Thread1(); Thread t1 = new Thread(thread1); Thread t2 = new Thread(thread1); t1.start(); t2.start(); } }
本來預想執行以後兩個線程會交替的在控制檯打印出0-49,但實際上只是各自打印出了
函數
[sm.examples.threaddemo.Thread1][Thread-0] - -----in while------0測試
[sm.examples.threaddemo.Thread1][Thread-1] - -----in while------0ui
使用main函數進行測試,實現了預想的效果。簡單思考了一下,感受是測試類中的test方法中啓動了兩個線程以後本身也結束了,因此啓動的線程在控制檯也不能輸出內容了。this
因而修改了一下代碼,在測試類的test方法中加入休眠等待,在控制檯輸出了預期效果。線程
修改後代碼:
package sm.test; import org.apache.log4j.Logger; import org.junit.Test; import sm.examples.threaddemo.Thread1; public class TestThreadDemo { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(TestThreadDemo.class); @Test public void test() { Thread1 thread1 = new Thread1(); Thread t1 = new Thread(thread1); Thread t2 = new Thread(thread1); t1.start(); t2.start(); try { logger.info("in test"); Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }