5

Javaで、スレッドが互いに分離されたままであることを確実にする確実な方法はありますか? さまざまなサード パーティのソース コードを実装するスレッドが、静的変数やその他の制御できないものが原因で衝突し続けるという問題が 1 週間半発生しました。

1 つのシステムで、現在取り組んでいるプロジェクトのインスタンスを必要なだけ実行できることを知っています。しかし、スレッド化された単一の実行可能ファイルにすべてを組み込もうとすると、常にエラーと例外が発生します。

必要なこのプログラムのインスタンスごとに新しいプロセスを起動する段階に近づいていますが、このルートをたどりたくはありません (収集した多くのリアルタイム データも削除されます)。対象のプロセスを強制終了する能力を妨げるため)。

提案?ありがとう!

4

7 に答える 7

11

使用したいライブラリの作成者がコードをスレッド セーフに設計していない場合、2 つのスレッドが同時にそれを呼び出すのを防ぐ以外に、簡単にできることはほとんどありません。

クラスローダを使っていくつかのトリックを実行することはできますが、これはまったく新しい複雑さの世界につながる傾向があります。詳しく説明すると、異なるクラスローダーを使用すると、同じクラスを同じ JVM に 2 回 (またはそれ以上) ロードすることができます。したがって、静的変数の独立したコピーを効果的に取得できます。この個別のクラスローダーの使用は、一部の Java EE アプリケーション サーバーで悪用されています。その結果、ライブラリ自体が何らかのリフレクションと動的なクラスローディングを開始したときに、どのクラスローダとクラスパスが使用されるかという問題が生じます。必要性が非常に高い場合を除き、このアプローチはお勧めしません。

好みによると、次のようになります。

1)。アンセーフ コード用のシングル スレッド ワーカーを用意します。マルチスレッド アプリでできるだけ多くの作業を行い、できるだけ Worker にドロップしないようにします。

2)。ワーカーが処理の主要な部分であり、並列実行が本当に必要な場合は、ワーカーを複数の個別のプロセスにプルアウトし、IPC 通信を使用してワークアウトを共有します。これは、JMS キューイング ソリューションがうまく機能するように思えます。

3)。IPCのオーバーヘッドを許容できない場合は、ライブラリに代わるスレッドセーフな代替手段を探すか、作成者に影響力がある場合は、コードの修正を依頼してください。並列処理を増やすのはそれほど難しいことではありません。

于 2009-08-17T14:15:16.043 に答える
4

さまざまなサード パーティのソース コードを実装するスレッドは、静的変数や、実際には制御できないその他の原因で衝突し続けます。

それが本当なら、別々のプロセスを持つという道をたどらなければならないと思います。呼び出すコードがスレッド セーフでない場合、できることは、このコードが一度に 1 つのプロセスによってのみ呼び出されるようにすることだけです。これは基本的に、別のスレッドで実行する利点を排除します。

対象のプロセスを強制終了する能力を妨げるだけでなく、

ここであなたの要点がわかりません。プロセスを安全に強制終了できるのはプロセスだけです。実行されるすべてのコードを完全に制御できない場合、スレッドを安全に強制終了することはできません。

同様の問題の議論については、この質問も参照してください。

于 2009-08-17T14:20:25.163 に答える
3

あなたの要件は、2006 年に承認されたJSR-121でカバーされています。

JSR-121 の実装についてはあまり聞いたことがありませんでしたが、簡単に検索してhttp://weblogs.java.net/blog/gczaj/archive/j2se/index.htmlにたどり着きました。

于 2009-08-17T22:41:32.210 に答える
0

これらのプロセスのうち2つが並行して実行されることがないように、リソースを単一のエグゼキュータに配置してみることができます。

それを行う方法は、エグゼキュータを使用することです。

class Foo {
  private ExecutorService executor = Executors.newSingleThreadExecutor();

  public void addTask(Runnable bar) {
    executor.submit(bar);
  }
}
于 2009-08-17T15:05:09.023 に答える
0

スレッドごとに個別のクラスローダーを使用して、個別に保持したいサードパーティのライブラリをロードできます。

于 2009-08-17T14:22:32.413 に答える
0

残念ながら、これを行う方法はありません。スレッドが共有リソースにアクセスする場合、必要に応じてこれらのリソースをロックする必要があります。そうしないと、プログラムは間違いなく共有状態の破損に直面します。

アクセスを同期できるように、共有リソースへのアクセスをラップできますか?

于 2009-08-17T14:15:49.553 に答える
0

必要なこのプログラムのインスタンスごとに新しいプロセスを起動するところまで来ていますが、このルートをたどりたくはありません (収集した多くのリアルタイム データも削除されます)。対象のプロセスを強制終了する能力を妨げるためです。)

再利用しようとしているコードは、実際にはマルチスレッド アプリケーションで使用するようには設計されていません。この場合、インスタンスごとに個別のプロセスを起動することが、実際には最善の選択肢となる可能性があります。各インスタンスを強制終了する能力を妨げるのではなく、実際にこれを簡単に実行できるようにする必要があります。を参照してくださいProcess.destroy()

「リアルタイム」が何を意味するのかは明確ではありませんが、各子プロセスが標準出力に書き込む場合、制御プログラムをコーディングして、書き込まれた出力を読み取って照合することができます。

于 2009-08-17T14:19:05.007 に答える