0

Excelファイルを読み込んでいるときに進行状況を表示しようとしています。最大行番号と最後に読み取った行番号を含むオブジェクトを共有します。150 行ごとに値をオブジェクトに保存し、それを待機させ、オブジェクトのロックが解除されるまで読み取りを停止します。

ダイアログ ウィンドウで、ProgressBarsyncExec または asyncExec メソッドを使用してオブジェクト内の値を更新しようとしました。メソッドを呼び出した直後にオブジェクトのロックが解除されます。

これらのメソッドは、ランナブルを実行するのに最も「適切な」機会を待っていることを知っています。しかし、私が理解していないように見えるのは、呼び出されている間に何も実行されていない場合、これらのメソッドが実行されないのはなぜですか?

私の実際の状況では、asyncExec は読み取りプロセスの最後にのみ ProgressBar を更新し、synExec はアプリケーションをハングさせます。これは、Object#wait の実行中に実行できないためです。

読んでくれてありがとう、そして答えてくれてありがとう。

4

2 に答える 2

2

次の合理的な機会は、ランナブルがイベント ループのキューの先頭に到達したときに発生します。ランナブルが待機している間、イベントループは常に実行されます。イベント ループのスレッドをデッドロックしていると思われます。

于 2012-07-10T09:25:53.257 に答える
1

1.待機を使用する代わりに、 java.util.concurrentパッケージのCountDownLatchを使用してみてください。

2.完了した作業に応じて進行状況バーを更新します。

3.一度に 1 枚の Excel シートだけを読んでいただければ幸いです。そのため、CountDownLatch を 1 つのカウンターのみで設定します。

4. Excel シートの読み取りが完了すると、カウンターが 0 になり、await() メソッドの後のコードが実行されます。ここで、ダイアログを閉じます。

このリンクを確認してください:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html

于 2012-07-10T09:26:52.303 に答える