0

私はOpenCYC apiを使用しています(ポイント以外はあまり一般的ではありません)..AccessObjectという名前のオブジェクトを作成しようとしていますao. 問題は、何らかの理由で、AccessObjectメインの Java Swing イベント スレッド内でインスタンス化できないことです。

AccessObjectしたがって、回避策として、メソッド内でインスタンス化するだけrun()で、それを返すためのゲッターも提供する別のスレッドを作成しました。

だから、これは私が呼び出しコードのために持っているものです:

// do something with code

AccessObject ao;
AccessObjectInstantiateThread aoThread = new AccessObjectInstantiationThread();
aoThread.start();

while(ao == null) // while loop to ensure we "wait" for aoThread to finish
{
     ao = aoThread.getAoObject();
}

// Then use ao however you want

現在、このコードは機能しますが、かなりばかげているようです。これを行うより良い方法はありますか?AccessObjectメインの Java イベント スレッドの下で をインスタンス化する方法はありません。

どうもありがとう、リッチ。

4

3 に答える 3

0

ao理想的には、起動スレッド (メソッド内) でAccessObject を作成し、それが完了するまでmain()UI (EventQueue.InvokeLaterのようなものを含むrunnable を使用して) を起動しないようnew JFrameにします。

それができない場合は、aovolatile にします。インスタンス化コードは、「get」メソッドに煩わされるのではなく、この値を直接設定する必要があります。おそらく、ランナブルを使用して InvokeLater を呼び出して表示を再調整する必要があります。たとえば、1 つまたは 2 つのボタンを有効にして、以前は不可能だったことが可能になったというメッセージをユーザーに送信します。

アクセスするすべてのコードaoは、null になる可能性があるという事実に備える必要があります。GUI は両方の方法で動作する必要があり、その状況をユーザーに明確にします。すべてのチェックまたは参照は次のようになります。

final AccessObject  local_ao = ao;
if (local_ao != null)  {
    // Do things.  USE local_ao, NOT oa!!!
}

つまり、変更されない local_ao を常に使用します。の値はaoいつでも変更できることに注意してください。説明したように、null から非 null にのみ変更され、1 回だけ変更されますが、コードが進化するにつれて変更される可能性があります。(進化しない場合は、最初の提案が最適かもしれません。)

UI (EventQueue) コードは何も待機しないようにする必要があります。スレッドは苦痛であり、いつでもスレッドを使用して UI を少し遅らせることができます。しかし、あなたはすでにスレッドの代価を支払っているので、お金の価値を手に入れることもできます.

于 2013-07-25T18:51:25.783 に答える