1. 程式人生 > >一個多執行緒面試問題

一個多執行緒面試問題

問題:有三個執行緒,其中兩個每秒執行j+1,第三個執行緒每秒執行j-2。實現程式碼:

package arithmetic;

public class ThreadTest {

    private static int j = 0;


    public static void main(String[] args) {
        Object object = new Object();
        Thread t1 = new Thread(new AddThread(object),"t1執行緒");
        Thread t2 = new Thread(new AddThread(object),"t2執行緒");
        Thread t3 = new Thread(new SubThread(object),"t3執行緒");
        t1.start();
        t2.start();
        t3.start();
    }


    public static class AddThread implements Runnable{

        private Object obj;

        private AddThread(Object object){
            this.obj = object;
        }

        @Override
        public void run() {
            synchronized (obj){
                while(true){
                    try {
                        obj.wait(1000);
                        j++;
                        System.out.println(Thread.currentThread().getName()+"加一,當前j="+j
                                + " 時間為:"+System.currentTimeMillis());
                        //obj.notifyAll();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }


    public static class SubThread implements Runnable{

        private Object obj;

        private SubThread(Object object){
            this.obj = object;
        }

        @Override
        public void run() {
            synchronized (obj){
                while(true){
                    try {
                        obj.wait(1000);
                        j-=2;
                        System.out.println(Thread.currentThread().getName()+"減二,當前j="+j +
                                " 時間為:"+System.currentTimeMillis());
                        //obj.notifyAll();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

執行結果:

t2執行緒加一,當前j=1 時間為:1537098141897
t1執行緒加一,當前j=2 時間為:1537098141897
t3執行緒減二,當前j=0 時間為:1537098141897
t2執行緒加一,當前j=1 時間為:1537098142903
t3執行緒減二,當前j=-1 時間為:1537098142903
t1執行緒加一,當前j=0 時間為:1537098142903
t3執行緒減二,當前j=-2 時間為:1537098143905
t1執行緒加一,當前j=-1 時間為:1537098143905
t2執行緒加一,當前j=0 時間為:1537098143905
t3執行緒減二,當前j=-2 時間為:1537098144922
t1執行緒加一,當前j=-1 時間為:1537098144922
t2執行緒加一,當前j=0 時間為:1537098144922
t3執行緒減二,當前j=-2 時間為:1537098145934
t1執行緒加一,當前j=-1 時間為:1537098145934
t2執行緒加一,當前j=0 時間為:1537098145934
t1執行緒加一,當前j=1 時間為:1537098146936
t2執行緒加一,當前j=2 時間為:1537098146936
t3執行緒減二,當前j=0 時間為:1537098146936
t3執行緒減二,當前j=-2 時間為:1537098147950
t1執行緒加一,當前j=-1 時間為:1537098147950
t2執行緒加一,當前j=0 時間為:1537098147950
t2執行緒加一,當前j=1 時間為:1537098148951
t1執行緒加一,當前j=2 時間為:1537098148951
t3執行緒減二,當前j=0 時間為:1537098148951
t2執行緒加一,當前j=1 時間為:1537098149952
t1執行緒加一,當前j=2 時間為:1537098149952
t3執行緒減二,當前j=0 時間為:1537098149952
t2執行緒加一,當前j=1 時間為:1537098150953
t1執行緒加一,當前j=2 時間為:1537098150953
t3執行緒減二,當前j=0 時間為:1537098150953
......