スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか?
どうしてもデッドロックが発生しうる方法しか思いつかず困っています。
例えば以下のプログラムで1212と交互に表示させたい場合です。
以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。
Object obj; //スレッド間通信用のobject
class Test1 extends Thread {
public void run() {
while(true) {
System.out.print("1");
synchronized (obj) {
obj.notify();//相手をnotifyして
obj.wait();//自分はwait
}
}
}
}
class Test2 extends Thread {
public void run() {
while(true) {
System.out.print("2");
synchronized (obj) {
obj.notify();
obj.wait();
}
}
}
}
new Test1().start();
new Test2().start();
No.1ベストアンサー
- 回答日時:
スレッド1・2を監視するスレッド3を作って3が1・2を交互に呼ぶ じゃだめ?
ありがとうございます。
方法の1つとして考えてみますが、なるべく2つのスレッドのみで実現したいです。
2つのスレッドでこういうことが不可能!ということが証明されているならばあきらめがつくのですが・・・。
No.2
- 回答日時:
「交互に」という状態を、お互いから参照できる仕組みを作る必要があるということですね?
かならず交互であるなら、スレッドは1つで、オブジェクト自身が状態を
交互に変化させるのではだめなのでしょうか?
質問はやりたいことを単純化したものなので、状態を変化させるという方法は使えません。
ただ、交互に処理を行いたい場合に状態を使う方法もありますね。
参考になりました。
先ほど色々試行錯誤した結果解決できたので締め切らせていただきます。
以下の方法で実現しました。
Object obj1; //スレッド間通信用のobject
Object obj2; //スレッド間通信用のobject2
class Test1 extends Thread {
public void run() {
while(true) {
System.out.print("1");
synchronized (obj1) {
synchronized (obj2) {
obj2.notify();//相手をnotifyして
}
obj1.wait();//自分はwait
}
}
}
}
class Test2 extends Thread {
public void run() {
while(true) {
System.out.print("2");
synchronized (obj2) {
synchronized (obj1) {
obj1.notify();
}
obj2.wait();
}
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- その他(プログラミング・Web制作) pythonで変数にオブジェクトを代入するにはどうしたらよいでしょうか 2 2023/08/20 20:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tryの終了
-
tomcat(struts)で起動時に処理...
-
Javaプログラムからポップアッ...
-
Linux上でのTomcatのServletプ...
-
doGetとdoPostの違い
-
Javaでのデバッグコード削除
-
VBScriptでPing
-
Odbcオブジェクトの解放の方法
-
Javaアプリケーション実行の返...
-
C#で別スレッドの終了を知りたい
-
JavaでVBのDOEVENTSと同様の処...
-
二次元配列について
-
CPU使用率が100%になり特定のプ...
-
EXCELマクロ Workbook_BeforeC...
-
Androidアプリで本体の音量変更...
-
GASで、起動時間の最大値を超え...
-
Javaの再帰でメソッド呼び出す...
-
ブラウザを閉じた後のサーバ側...
-
無限ループをわざと作って時計...
-
JavaScriptからJAVAクラスを呼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
Tomcat高負荷時の設定について
-
onBlurとonFocusの処理順序につ...
-
Javaでのデバッグコード削除
-
ラジオボタンの選択判定
-
WPF C#でF10のイベント取得方法...
-
doGetとdoPostの違い
-
SwingUtilities.invokeLater(ne...
-
アコーディオンメニューをアン...
-
数値の定数を付ける時
-
switch文の中に、throws new Ex...
-
JAVAからJAVASCRIPT関数を呼び出し
-
再度、スレッドが実行中かどう...
-
ラベルの表示までが異常に遅い...
-
JavaScriptからJAVAクラスを呼...
-
javaのプログラムが止まる
-
Javaプログラムからポップアッ...
-
C#で別スレッドの終了を知りたい
-
vba Sleep関数について教えてく...
-
Tomcatのスレッドを破棄する方法
おすすめ情報