本文内容介绍在使用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();
		}
	}
}