import
java.util.concurrent.*;
public
class
GFG {
LinkedTransferQueue<Integer> LTQ
=
new
LinkedTransferQueue<>();
class
Producer
implements
Runnable {
@Override
public
void
run()
{
for
(
int
i =
0
; i <
3
; i++) {
try
{
System.out.println(
"Producer is"
+
" waiting to transfer..."
);
LTQ.transfer(i);
System.out.println(
"Producer "
+
"transferred element: "
+ i);
System.out.println(
"Waiting consumer "
+
"count after transfer: "
+ LTQ
.getWaitingConsumerCount());
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
}
class
Consumer
implements
Runnable {
int
id;
Consumer(
int
id)
{
this
.id = id;
}
@Override
public
void
run()
{
try
{
System.out.println(
"Consumer "
+ id
+
" is waiting to "
+
"take element..."
);
System.out.println(
"Waiting consumer"
+
" count before take: "
+ LTQ
.getWaitingConsumerCount());
Integer s = LTQ.take();
System.out.println(
"Consumer "
+ id
+
" received Element: "
+ s);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
public
static
void
main(String[] args)
throws
InterruptedException
{
GFG obj =
new
GFG();
ExecutorService exService
= Executors.newFixedThreadPool(
3
);
Producer producer = obj.
new
Producer();
Consumer consumer0 = obj.
new
Consumer(
0
);
Consumer consumer1 = obj.
new
Consumer(
1
);
Consumer consumer2 = obj.
new
Consumer(
2
);
exService.execute(producer);
exService.execute(consumer0);
exService.execute(consumer1);
exService.execute(consumer2);
exService.shutdown();
}
}