diff --git a/Concurrency/ThreadCommunication.java b/Concurrency/ThreadCommunication.java
new file mode 100644
index 0000000..e9a77bb
--- /dev/null
+++ b/Concurrency/ThreadCommunication.java
@@ -0,0 +1,108 @@
+import java.lang.Runnable;
+import java.lang.Thread;
+import java.util.LinkedList;
+
+class SharedQueue{
+    private static LinkedList<Integer> queue;
+    private Object queueLock;
+
+    public SharedQueue(){
+        queue = new LinkedList<>();
+    }
+    
+    public void addElement(int element){
+        synchronized(queueLock){
+            queue.addLast(element);
+        }
+    }
+
+    public int getElement(){
+        int result;
+        synchronized(queueLock){
+            result = queue.getLast();
+        }
+        return result;
+    }
+}
+
+class WriterTask implements Runnable{
+    private String taskName;
+    private static SharedQueue sharedQueue;
+    private int startIndex;
+
+    public WriterTask(String taskName, SharedQueue sharedQueue){
+        this.taskName = taskName;
+        this.sharedQueue = sharedQueue;
+        this.startIndex = 1;
+    }
+
+    public WriterTask(String taskName, SharedQueue sharedQueue, int startIndex){
+        this.taskName = taskName;
+        this.sharedQueue = sharedQueue;
+        this.startIndex = startIndex;
+    }
+
+    @Override
+    public void run() {
+        for(int job = this.startIndex; job <= this.startIndex +  100; job++){
+            try{
+                System.out.println("" + this.taskName + " doing job " + job);
+                sharedQueue.addElement(job);
+                System.out.flush();
+                Thread.sleep(1000);
+            }catch(Exception exception){
+                System.err.println("" + this.taskName + " error in doing job " +
+                    job + " details: "+exception.getMessage());
+            }
+        }
+    }
+}
+
+class ReaderTask implements Runnable{
+    private String taskName;
+    private static SharedQueue sharedQueue;
+
+    public ReaderTask(String taskName, SharedQueue sharedQueue){
+        this.taskName = taskName;
+        this.sharedQueue = sharedQueue;
+        // this.startIndex = 1;
+    }
+
+    @Override
+    public void run() {
+        for(int job = 1; job <= 100; job++){
+            try{
+                int result = sharedQueue.getElement();
+                System.out.println("" + this.taskName + " iteration: " + job +" result: "+result);
+                System.out.flush();
+                Thread.sleep(3000);
+            }catch(Exception exception){
+                System.err.println("" + this.taskName + " error in doing job " + job);
+            }
+        }
+    }
+}
+
+class ThreadCommunication{
+    public static void main(String[] args) throws Exception{
+        SharedQueue sharedQueue = new SharedQueue();
+
+        WriterTask taskA = new WriterTask("Writer task W1", sharedQueue);
+        Thread firstWriterThread = new Thread(taskA);
+
+        WriterTask taskB = new WriterTask("Writer task W2", sharedQueue, 101);
+        Thread secondWriterThread = new Thread(taskB);
+
+        firstWriterThread.start();
+        secondWriterThread.start();
+
+        ReaderTask readerTask = new ReaderTask("reader task R1 ", sharedQueue);
+        Thread readerThread = new Thread(readerTask);
+        readerThread.start();
+
+        readerThread.join();
+        firstWriterThread.join();
+        secondWriterThread.join();
+
+    }
+}
\ No newline at end of file