一道java的多线程编程题,对运行结果的疑惑

康州牧码人 发布于 2014/06/07 19:05
阅读 200
收藏 2

4个线程,两个线程对N加一,两个线程对N减一(使用synchronized方法进行加减)

主线程中,创建并开启四个线程,4个线程设置了每个线程要运行100次

可是结果是:4个线程都有可能运行不到各自的100次

对这个结果有点不太理解?

我暂时能想到是的JVM中有一块区域专门负责线程存放阻塞的线程,阻塞的线程太多,所以导致没有运行道各自的100次?

代码:

public class testThread {
	private int j = 100;

	@Test
	public void test() {
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					for (int i = 0; i < 100; i++) {
						inc();
					}
				}
			}).start();

			new Thread(new Runnable() {
				@Override
				public void run() {
					for (int i = 0; i < 100; i++) {
						dec();
					}
				}
			}).start();
		}
	}

	private synchronized void inc() {
		j++;
		System.out.println(Thread.currentThread().getName() + "    +inc  " + j);
	}

	private synchronized void dec() {
		j--;
		System.out.printn(Thread.currentThread().getName() + "  -dec  " + j );
	}
}




加载中
0
Timco
Timco

引用来自“Timco”的评论

请贴代码。我之前也做过这个,发现比我认为的要复杂一点,有没注意到的坑 。

同学,都执行了,只不过你输出的方式不直观。

new Thread(new Runnable() {
				@Override
				public void run() {
					int k = 0;
					for (int i = 0; i < 100; i++) {
						inc();
						k++;
					}
					System.out.println(Thread.currentThread().getName() + "   " + k);
				}
			}).start();



在每个线程内用k计数并打印出来。以下是结果


0
悟方向
悟方向
没有代码你让大家怎么帮你分析
康州牧码人
康州牧码人
代码已经补上 谢谢提醒
0
Timco
Timco
请贴代码。我之前也做过这个,发现比我认为的要复杂一点,有没注意到的坑 。
康州牧码人
康州牧码人
已补 谢谢提醒
0
康州牧码人
康州牧码人

引用来自“Timco”的评论

引用来自“Timco”的评论

请贴代码。我之前也做过这个,发现比我认为的要复杂一点,有没注意到的坑 。

同学,都执行了,只不过你输出的方式不直观。

new Thread(new Runnable() {
				@Override
				public void run() {
					int k = 0;
					for (int i = 0; i < 100; i++) {
						inc();
						k++;
					}
					System.out.println(Thread.currentThread().getName() + "   " + k);
				}
			}).start();



在每个线程内用k计数并打印出来。以下是结果


是eclipse里面显示的问题吗?
康州牧码人
康州牧码人
谢谢 我也正常执行了 的确是都运行了
0
悟方向
悟方向
代码本身并没什么大的问题 你这个问题的本身是因为你采用的是用junit来测试你这个多线程的程序,而junit在处理这种情况的时候,会在主方法执行完成后调用System.exit退出jvm 所以就有可能出现有些线程没执行到预期的次数  你可以在主线程后加个 join方法调用 等待子线线执行完在退出 或者加上个sleep等一会儿 你就能发现你想要的结果
0
康州牧码人
康州牧码人

引用来自“享开发”的评论

代码本身并没什么大的问题 你这个问题的本身是因为你采用的是用junit来测试你这个多线程的程序,而junit在处理这种情况的时候,会在主方法执行完成后调用System.exit退出jvm 所以就有可能出现有些线程没执行到预期的次数  你可以在主线程后加个 join方法调用 等待子线线执行完在退出 或者加上个sleep等一会儿 你就能发现你想要的结果
好的 我试试 谢谢!
康州牧码人
康州牧码人
的确是junit的问题!我让主线程sleep了,每次都能正常运行出4个结果,谢谢
返回顶部
顶部