import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.LinkedTransferQueue;
public
class
GFG {
LinkedTransferQueue<Integer> LTQ
=
new
LinkedTransferQueue<>();
class
LTQProducer
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(
"Is there any consumer"
+
" still waiting to"
+
" receive an element"
+
" after transfer -> "
+ LTQ.hasWaitingConsumer());
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
}
class
LTQConsumer
implements
Runnable {
int
id;
LTQConsumer(
int
id)
{
this
.id = id;
}
@Override
public
void
run()
{
try
{
System.out.println(
"Consumer "
+ id
+
" is waiting to "
+
"take an element."
);
System.out.println(
"Is there any consumer"
+
" still waiting to"
+
" receive an element"
+
" after transfer -> "
+ LTQ.hasWaitingConsumer());
Integer s = LTQ.take();
System.out.println(
"Consumer "
+ id
+
" received Element: "
+ s);
}
catch
(InterruptedException e) {
System.out.println(e);
}
}
}
public
static
void
main(String[] args)
throws
InterruptedException
{
GFG ob =
new
GFG();
ExecutorService exService
= Executors.newFixedThreadPool(
3
);
LTQProducer p = ob.
new
LTQProducer();
LTQConsumer c1 = ob.
new
LTQConsumer(
0
);
LTQConsumer c2 = ob.
new
LTQConsumer(
1
);
exService.execute(p);
exService.execute(c1);
exService.execute(c2);
exService.shutdown();
}
}