私はこの質問にうんざりしていて、最終的にいくつかの疑問が生じました。私を助けてください
疑問: スレッドが待機状態にあり、他のスレッドがそのスレッドに通知していない場合、そのスレッドは決して終了しないのでしょうか? 待機(長いミリ秒)を使用した後でも。
コードの場合:コードからの私の要件は何ですか(私のコードを参照してください):
a : "Even Thread Finish" と "Odd Thread Finish" を印刷する必要があります (順序は imp ではありませんが、両方を印刷する必要があります)。
b: また、メイン関数で「Exit Main Thread」を出力する必要があります
実際に何が起こっているか: 多くの実行の後、場合によっては、「Even Thread Finish」と出力されてここでハングアップするか、その逆です。場合によっては、両方を印刷します。
また、「Exit Main Thread」は出力されません。
コードを変更する方法 、したがって、3つのステートメントすべてを出力する必要があります。
簡単に説明すると、メイン スタート -> t1 スタート -> t2 スタート、そして t2/t1 フィニッシュ -> メイン フィニッシュが必要です。
この問題について私を助けてください
これが私のコードです:
import javax.sql.CommonDataSource;
public class ThreadTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Share commonObj = new Share();
Thread even = new Thread(new EvenThread(commonObj));
Thread odd = new Thread(new OddThread(commonObj));
even.start();
odd.start();
try {
Thread.currentThread().join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Exit Main Thread");
}
}
class EvenThread implements Runnable {
private Share commShare;
public EvenThread(Share obj) {
// TODO Auto-generated constructor stub
this.commShare = obj;
}
private int number = 2;
public void run() {
System.out.println("Even Thread start");
while (number <= 50) {
if (commShare.flag == true) {
System.out.println("Even Thread" + number);
number += 2;
commShare.flag = false;
synchronized(commShare) {
try {
commShare.notify();
commShare.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
commShare.notify();
}
} else {
synchronized(commShare) {
try {
commShare.notify();
commShare.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
commShare.notify();
}
}
}
System.out.println("Even Thread Finish");
}
}
class OddThread implements Runnable {
private int number = 1;
private Share commShare;
public OddThread(Share obj) {
// TODO Auto-generated constructor stub
this.commShare = obj;
}
public void run() {
System.out.println("Odd Thread start");
while (number <= 50) {
if (commShare.flag == false) {
System.out.println("Odd Thread :" + number);
number += 2;
commShare.flag = true;
synchronized(commShare) {
try {
commShare.notify();
commShare.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
commShare.notify();
}
}
}
System.out.println("Odd Thread Finish");
}
}
class Share {
Share sharedObj;
public boolean flag = false;
}