0

私は Java でマルチスレッド ソリューションを作成して、2 つのシステム A と B を接続しています。システム A は完全にシリアルであり、スレッド化されておらず、システム B に送信するデータを提供します。システム B は、複数のソースからのデータを非同期で同時に受け入れます。時間。

スレッドの管理に ThreadPoolExecutor を使用しています。システム A は新しいオブジェクトを作成できませんが、静的オブジェクトを呼び出すことはできるため、ThreadPoolExecutor (これも静的) をラップするクラス TP の静的シングルトン インスタンスを使用しています。

ここが私が立ち往生している場所です。本格的に始める前に、セットアップの非常に基本的なテストを行っています。テスト用に T1 と T2 の 2 つのクラスを作成しました。これらの各クラスは、クラス TP (静的シングルトンが作成される場所) をインポートします。T1 がいくつかのオブジェクトを TP キューに追加し、次に T2 がさらにオブジェクトを追加します。

TP オブジェクトは静的として宣言されていますが、2 つのバージョンが並行して実行されているように見えます。T2 によってキューに送信されたオブジェクトは、T1 によって送信されたオブジェクトがすべて実行される前に実行されています。また、T1 も T2 も ThreadPoolExector で shutdown() を呼び出さないため、どちらもハングして終了しません。

異なる Java 実行可能ファイルからでも、処理する何かを送信するたびに基本的にウェイクアップするトレッドのデーモン静的インスタンスを作成するにはどうすればよいですか?

4

3 に答える 3

1

2 つの別個のプロセスを実行している場合、シングルトンであるかどうかに関係なく、2 つの別個の型と 2 つの別個のインスタンスがあります。

2 つの異なるプロセスを相互に通信させたい場合は、その問題に完全に個別に対処する必要があります。ネットワーク、名前付きパイプ (Java IIRC ではトリッキー)、メモリ マップ ファイル、一方のプロセスが他方のプロセスにタスクを配置する単純な共有ディレクトリなど、さまざまな IPC メカニズムが利用可能です。

また、何がハングしているのか、またはスレッドプールがどのように構成されているのか、正確には明らかではありません。問題が本当に (IPC 側ではなく) スレッド側にある場合は、問題を示す短いが完全なプログラムを投稿してください。

于 2009-05-15T19:30:54.927 に答える
0

それぞれが同じ静的シングルトン クラスを使用する 2 つの異なる「メイン」クラスを実行しているように思えます。その場合、シングルトンのインスタンスが 2 つ (各 JVM に 1 つ) 作成されます。

Skeetがコメントしたように、あなたがしたいことは、サービスとして実行され、IPCのメカニズムを公開する別のプロセスにスレッドプールをカプセル化することだと思います。これを行う一般的な方法は、JMS キューを公開してさまざまなプロデューサからリクエストを受信し、コンシューマ (デーモン) が受信したリクエストを処理のためにスレッド プールにディスパッチすることです。

このサービスをデーモンとして実行するには、コンテナーでホストするか、Windows で実行している場合はJava Service Wrapperなどを使用します。

于 2009-05-15T19:51:53.723 に答える
0

スレッド プールのサイズが 1 より大きい場合、すべての T1 オブジェクトが最初に処理されるという保証はありません。

于 2009-05-15T19:30:44.990 に答える