簡體   English   中英

Java線程,我的代碼怎么了

[英]java threading, what's wrong with my code

我想在另一個線程中更新一個對象,然后在當前線程中訪問它:

 public Object getValueAt(final int rowIndex, int columnIndex) {
            data.getRealm().exec(new Runnable(){
                @Override
                public  void run() {

                    System.out.println("Object at " + rowIndex  + " in WritableList is "  + data.get(rowIndex));
                    object = (DOModel) data.get(rowIndex);
                    System.out.println(object);
                    object.notify();
                }
            });
// suspend current thread
            try {
                synchronized (object){
                    object.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(columnIndex == 0){
                System.out.println(object);
                return object.getId();
            }
    }

但是當我運行代碼時,會發生java.lang.IllegalMonitorStateException。

我更改了代碼,請參見代碼中的注釋: 編輯--------------------------------

    public Object getValueAt(final int rowIndex, int columnIndex) {
            data.getRealm().exec(new Runnable(){
                @Override
                public  void run() {
                    System.out.println("Object at " + rowIndex  + " in WritableList is "  + data.get(rowIndex));
                    object = (DOModel) data.get(rowIndex);
                    synchronized(object){
                        object.notify();
                    }
                }
            });
            try {
                synchronized (object){
                    object.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
// this line below is never executed.
                System.out.println(object);
            if(columnIndex == 0){

                return object.getId();
            }
    }

為了能夠進行通知,您需要在監視器上進行同步。 您需要執行以下操作:

synchronized (object) {
   object.notify();
}

而不是run()中未同步的notify()。

您將以任何方式遇到競爭條件。 當尚未在單獨的線程中檢索到object時,您的主線程可能正在嘗試在該object上進行同步。

最好是定義一個單獨的鎖/監視器,並將其用於同步和通知。

第二次編輯:另外:如果單獨的線程檢索對象並在主線程等待之前進行通知,則它可能會無限期地等待。

notify()調用應在同一監視器的同步塊內

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM