设计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~