设计4个线程,内中两个线程每次对j增加1,另外两个线程对j每次减少1

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1

java多线程问题,主要考察的就是如何创建线程。此题当然是采用实现runnable接口的方式比较方便。值得思考一下的是最后的运行结果~

程序结束的时候j的值是多少呢?


如果每个线程执行的次数都相同,那么结果当然是0了。因为这两对线程两两抵消。最后j就为0了。

代码如下:

package go.derek;
public class ThreadTest {
	private int j;

	private synchronized void inc(){
		j++;
		System.out.println(Thread.currentThread().getName()+" inc "+j);
	}
	private synchronized void dec(){
		j--;
		System.out.println(Thread.currentThread().getName()+" dec "+j);
	}
	class Inc implements Runnable{
		public void run(){
			for(int i=0;i<10;i++){
				inc();
			}
		}
	}
	class Dec implements Runnable{
		public void run(){
			for(int i=0;i<10;i++){
				dec();
			}
		}
	}
	public static void main(String[] args){
		ThreadTest th=new ThreadTest();
		//这是创建内部类对象的套路。
		Inc inc=th.new Inc();
		Dec dec=th.new Dec();
		for(int i=0;i<2;i++){
			Thread t=new Thread(inc);
			t.start();
t=new Thread(dec);t.start();}}}运行结果如下:

Thread-0 inc 1
Thread-0 inc 2
Thread-0 inc 3
Thread-0 inc 4
Thread-0 inc 5
Thread-0 inc 6
Thread-0 inc 7
Thread-0 inc 8
Thread-0 inc 9
Thread-0 inc 10
Thread-1 dec 9
Thread-1 dec 8
Thread-1 dec 7
Thread-1 dec 6
Thread-1 dec 5
Thread-1 dec 4
Thread-1 dec 3
Thread-1 dec 2
Thread-1 dec 1
Thread-1 dec 0
Thread-2 inc 1
Thread-2 inc 2
Thread-2 inc 3
Thread-2 inc 4
Thread-2 inc 5
Thread-2 inc 6
Thread-2 inc 7
Thread-2 inc 8
Thread-2 inc 9
Thread-2 inc 10
Thread-3 dec 9
Thread-3 dec 8
Thread-3 dec 7
Thread-3 dec 6
Thread-3 dec 5
Thread-3 dec 4
Thread-3 dec 3
Thread-3 dec 2
Thread-3 dec 1
Thread-3 dec 0
当然每次的运行结果是不同的,但最后的结果肯定是0~