public class class_Q {
volatile boolean valueSet = false;
volatile int n;
synchronized int get()
{
System.out.println("Now i am in get block and valueset is : "+ valueSet );
if(!valueSet)
{
System.out.println("i am waiting in get block.....and releasing lock ");
try{
wait();
}catch(InterruptedException e)
{
System.out.println( "InterruptedException caught" );
}
}
System.out.println( " value of n now in get block is : " + n );
valueSet=false;
notify();
return n;
}
synchronized void put(int n)
{
System.out.println(" Now i am in Put block and valueset is : "+ valueSet);
if(valueSet)
{
try
{
System.out.println("i am waiting in put block......and releasing lock. ");
wait();
}catch(InterruptedException e)
{
System.out.println( "InterruptedException caught" );
}
}
this.n = n;
valueSet = true;
System.out.println( "the value of n now in put block is : " + n );
notify();
}
}
class Producer implements Runnable{
class_Q q;
Producer(class_Q q)
{
this.q = q;
new Thread( this, "Producer" ).start();
}
public void run()
{
int i = 0;
while(true)
{
q.put(i++);
}
}
}
class Consumer implements Runnable{
class_Q q;
Consumer(class_Q q)
{
this.q = q;
new Thread(this, "Consumer").start();
}
public void run()
{
while(true)
{
q.get();
}
}
}
class PCFixed {
public static void main (String args[])
{
class_Q q = new class_Q();
new Producer(q);
new Consumer(q);
System.out.println( "Press Control-C to stop." );
}
}
*出力**
今、私は get ブロックにいて、valueset は false です
私はgetブロックで待っています...そしてロックを解放しています
Control-C を押して停止します。
今、私はプットブロックにいて、値セットは: false
put ブロックの n の値は : 0
get ブロックの n の値は次のとおりです: 0
今、私は get ブロックにいて、valueset は false です
私はgetブロックで待っています...そしてロックを解放しています
今、私はプットブロックにいて、値セットは: false
put ブロックの n の値は : 1
get ブロックの n の値は : 1
出力の 6 行目以降、get() スレッドが (" notify() " ) put() スレッドを起動することを期待しています。誰かが get() スレッドを呼び出す背後にあるロジックを理解するのを手伝ってもらえますか (つまり、なぜそれが get ブロックにあるのですか?)