問題タブ [java-threads]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
298 参照

java - Javaでスレッドを使用したタスクスケジューリング(編集済み)

私は現在、運用業務用の DB 統合日次ファイル転送スケジューリング フォーム アプリケーションに取り組んでいます。特定のスケジュールを制御してアクセスできるようにするために、スケジュールごとにスレッドを作成して、特定のスケジュールをオンデマンドで停止または再開できるようにすることにしました。これを実現するために、カスタム スレッド クラスとそのコンストラクター、スレッドのインスタンスを作成して実行するメイン クラス、および日次スケジューリングの実行可能なメソッドを含む別のクラスを含む別のクラスを作成しました。特定のスレッドにアクセスできるようにするために、ConcurrentHashMap を実装して、作成されたスレッドのハッシュコードと名前を ThreadGroup と同期させようとしました。スレッドを作成すると、スレッドの名前とハッシュコードを ConcurrentHashMap に渡すことができます。ThreadGroup とともに。しかし、2 番目または 3 番目のスレッドを作成すると、指定されたスレッドの指定された名前とハッシュコードが変更されていることがわかりました。上で説明したクラスを以下に示します。

それぞれがスレッドによって実行されるように、2 つの異なるスケジュールをアクティブにしました。アクティブなスレッドの出力を見ることができました

上記の出力からわかるように、Test 2 という名前のスレッドの名前と hashCode は、threadMap(hashMap) に入れられた値に対応していません。特定の操作に静的な名前とハッシュコードを付けて、それぞれに具体的にアクセスして停止、一時停止、再開、または削除できるようにしたいと考えています。したがって、何が問題を引き起こしているのか、または私が間違った方法で実装したのだろうかと思います。

0 投票する
1 に答える
386 参照

java - Java Callable : 複数のスレッド プロセスにかかる時間

次のサンプルコードがあります。

出力は次のように広がります

お気づきのように、2 番目の行はほぼ一定ですが、スレッド化されたバージョンは大きく異なります。なぜそのような場合があるのですか?変動性を減らすために何ができるでしょうか?私はJavaマルチスレッドに慣れていないので、何か愚かなことをしている場合はお知らせください。

0 投票する
1 に答える
558 参照

java - 実行中のスレッドで public クラスからメソッドを呼び出す

ここまでは、Model-View-Controller パターンに従ってプログラムを分割しました。私のスレッドのために、新しいクラスを作成しました:

run() メソッドでは、スレッドは別のクラスのメソッドを呼び出す必要があります (たとえば、私の目的では public クラスの Controller)。

クラス コントローラーをインスタンス化することはできますが、MVC の原則を守るという目的が失われることはありませんか?

どうすればいいですか?

0 投票する
3 に答える
8368 参照

java - スレッド割り込みメソッドでスレッドを停止する方法

スレッドの割り込みと、停止を呼び出さずにスレッドを終了させる方法を学習しようとしています。

出力

Sleeping が 2 回目に出力され、中断された例外が 1 回目ではなく 2 回目にスローされる理由を理解できません。java でスレッドを停止するために volatile キーワードが使用されている投稿を確認しましたが、それがどのように使用されるのか理解できません。このシナリオでは、スレッドが割り込みで停止するためです。

0 投票する
1 に答える
493 参照

java - このプログラムを安全にするために共有変数を同期する方法は?

Java Concurrency in Practiceという本を読んだところ、安全でないプログラムが表示されました。

この本には次のように書かれています。

同期には、別の重要で微妙な側面もあります。それは、メモリの可視性です。別のスレッドがオブジェクトを使用しているときに、あるスレッドがそのオブジェクトの状態を変更できないようにするだけでなく、あるスレッドがオブジェクトの状態を変更したときに、他のスレッドが実際に行われた変更を確認できるようにすることも必要です。ただし、同期がないと、これは発生しない可能性があります。

したがって、同時書き込みがなくても、スレッド間で共有されるデータは、あるスレッドによって書き込まれ、別のスレッドによって読み取られるように、書き込みスレッドによって読み取りスレッドに発行されるように同期する必要があることを理解しています。書き込みスレッドは、読み取りスレッドを開始した後、書き込みスレッドによって書き込まれたデータの読み取りをループする別のスレッドを開始できます。データは共有される場合と共有されない場合があります。データが複数の変数である場合、共有される変数と共有されない変数があり、共有順序が異なる場合があります。スレッド間で共有されるすべてのデータを同期する必要があります。次のプログラムが同期ブロックを使用しなかった場合、リーダー スレッドは、ready true を認識しないか、数値セットを確認した後に true を認識します。同期されていないデータは、スレッドにとって古くなります。古いデータを避けるために、書き込みアクセス中だけでなく、読み取りアクセス中にも同期する必要があります。書き込みアクセスを同期するだけでは、データが古くなるのを防ぐことはできません。

このサンプル プログラムを安全にするには、synchronize ステートメントをどのように使用すればよいのでしょうか。

0 投票する
2 に答える
2098 参照

java - 「implements Runnable」を使用して特定のソケットスレッドでメソッドを呼び出すにはどうすればよいですか?

私は3つのメインクラスを含む動作中のJavaサーバーを持っています(端が少し荒いですが)。

最初のクラスはサーバーを実行し、ソケットを取得してポートをリッスンし、新しい接続をクライアント ハンドラーに渡します。

2 番目のクラスは、スレッド化されたクライアント ハンドラーです。

3 つ目は、クライアント ハンドラから呼び出されて情報を処理するプロトコル クラスです。情報が処理されると、プロトコル クラスは処理済みまたはフォーマット済みの応答をクライアント ハンドラーに返し、クライアントに渡します。

利点は、2 番目のクラスに、ソケットから受け入れ可能なデータをロードするだけでよいことです。データはプロトコル ハンドラに渡すことができ、プロトコル ハンドラには、サーバーがクライアントと通信するために使用する任意のプロトコルをロードできます。

この例では、telnet ベースのチャット クラスをロードしました。

たとえば、誰かがチャットを離れた場合、クライアント ハンドラ クラスは次のようなコードを実行する可能性があります。

これはクラスに渡さ"** [username] has left the room **"れ、serverprotocolクラスはメッセージをクライアントに送信するための最適な方法でデータを返します。この場合、serverprotocolクラスはクライアントに画面を再描画し、新しいメッセージを追加し、バッファ内の既存の現在のメッセージを上にスクロールするように指示する telnet 制御コードを使用してメッセージをフォーマットします。

また、クライアント ハンドラー クラスは、たとえばユーザーが特定のチャット ルームにいるソケットにのみメッセージを送信する必要があるため、常にすべてのソケットに送信する必要はありません。

私のコードでは、これはクラス 1 です。ソケットを受け入れるサーバー クラスは次のとおりです。

クラス 2 は、スレッドを拡張するクラスです。

代わりにこれを機能させることができるかどうかを必死に確認しようとしましたが、スレッドのインスタンス番号に基づいてスレッドの(またはおそらくそれを読み取る必要がある) メソッドをimplements Runnable呼び出すことができませんでした (ここのコードで単に呼び出されます)。 .processInputdataToBeProcessedi

私が見た中で最も近いもの:

https://github.com/ico77/chat-server-client/blob/master/src/main/java/hr/ivica/chat/server/ChatServer.java

これは、サーバーをスレッド化されたプール サーバーとして実行する際に利用できます。

ただし、この場合の関数は、 を介してソケットに関連付けられた にsendToAll直接書き込みます。サーバーでは、個々のプロトコル ハンドラー クラスに送信することはできません。また、個々のクラス インスタンスに送信することもできません。これは、たとえば、メッセージをソケット 1 と 3 のみに送信してから、別のメッセージをソケット 2 に送信できないことを意味します。PrintWriterHashMapChatServerWorker

を使用せずにソケットハンドラーのインスタンスを呼び出すことができるオンラインの例が1つも見つかりませんextends Thread

具体的には、次のような行を使用できるようにしたいと考えています。

また

整数を使用して、スレッド インスタンス、またはそのスレッドで使用される任意のクラス変数またはメソッドを参照できます。

何か不足していますか?