一個多執行緒面試問題
阿新 • • 發佈:2018-12-10
問題:有三個執行緒,其中兩個每秒執行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 ......