【Java】使用Junit測試線程過程中出現的小問題

本文內容介紹在使用Junit進行線程測試的時候出現的一個小問題,自己簡單做一個記錄,以便後續查看


在使用java編寫多線程併發實驗程序時在Juint寫了測試程序,但並沒有得到預想的效果。

直接上代碼


線程類:

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;
			}

		}
	}

}

測試類:

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------0


使用main函數進行測試,實現了預想的效果。簡單思考了一下,感覺是測試類中的test方法中啓動了兩個線程之後自己也結束了,所以啓動的線程在控制檯也不能輸出內容了。


於是修改了一下代碼,在測試類的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();
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章