2 つのスレッドを開始するコード スニペットを作成しました。1 つのスレッドはすべての奇数を出力し、別のスレッドはすべての偶数を出力します。固有のロックとスレッド通信コマンドを組み合わせて使用し、2 つのスレッドの適切なインターリーブを実現しました。ここに私のコードがあります、
public class threadEvenOdd implements Runnable
{
static Boolean isOdd=true;
int count = 10;
Boolean value;
static int c=1;
static Object lock = new Object();
threadEvenOdd(Boolean temp)
{
value = temp;
}
public void run()
{
if(value)
{
printOdd(count);
}
if(!value)
{
printEven(count);
}
}
void printOdd(int count)
{
try
{
for(int i=0;i<count/2;i++)
{
//System.out.println("odd enters lock");
synchronized(lock)
{
if(!isOdd)
{
//System.out.println("odd in barrier");
lock.wait();
}
System.out.println(c);
c++;
isOdd = false;
//System.out.println("odd notifies");
lock.notify();
}
}
}
catch(Exception e)
{
System.out.println(e);
}
}
void printEven(int count)
{
try
{
for(int i=0;i<count/2;i++)
{
//System.out.println("even enters lock");
synchronized(lock)
{
if(isOdd)
{
//System.out.println("even in barrier");
lock.wait();
}
System.out.println(c);
c++;
isOdd = true;
//System.out.println("even notifies");
lock.notify();
}
}
}
catch(Exception e)
{
System.out.println(e);
}
}
public static void main (String args[])
{
threadEvenOdd th1 = new threadEvenOdd(true);
threadEvenOdd th2 = new threadEvenOdd(false);
Thread t1 = new Thread(th1);
t1.setName("odd");
Thread t2 = new Thread(th2);
t2.setName("even");
//System.out.println(t1.getName() + " starts");
t1.start();
//System.out.println(t2.getName() + " starts");
t2.start();
}
}
ここに私の質問があります:
奇数スレッドは printOdd() 関数で実行され、偶数スレッドは printEven() 関数で実行されます。両方のスレッドに 1 つの固有ロックを使用しています。同じロックを使用するため、2 つのスレッドがそれぞれの同期ブロックに同時に存在する方法がわかりません。
コードからスレッド通信ステートメント (通知、待機) を削除しましたが、それでも目的の出力が得られました。私のコードが実際にスレッド通信ステートメントを必要とするかどうか疑問に思っています。
私はまだ自分のコードを理解するのに苦労しているので、マルチスレッドの概念の理解に取り組む必要があると思います:p私が使用したマルチスレッドの概念のみを使用してこれを行うより良い方法があるかどうか誰か説明できますか?