1+ import java .lang .Runnable ;
2+ import java .lang .Thread ;
3+ import java .util .LinkedList ;
4+
5+ class SharedQueue {
6+ private static LinkedList <Integer > queue ;
7+ private Object queueLock ;
8+
9+ public SharedQueue (){
10+ queue = new LinkedList <>();
11+ }
12+
13+ public void addElement (int element ){
14+ synchronized (queueLock ){
15+ queue .addLast (element );
16+ }
17+ }
18+
19+ public int getElement (){
20+ int result ;
21+ synchronized (queueLock ){
22+ result = queue .getLast ();
23+ }
24+ return result ;
25+ }
26+ }
27+
28+ class WriterTask implements Runnable {
29+ private String taskName ;
30+ private static SharedQueue sharedQueue ;
31+ private int startIndex ;
32+
33+ public WriterTask (String taskName , SharedQueue sharedQueue ){
34+ this .taskName = taskName ;
35+ this .sharedQueue = sharedQueue ;
36+ this .startIndex = 1 ;
37+ }
38+
39+ public WriterTask (String taskName , SharedQueue sharedQueue , int startIndex ){
40+ this .taskName = taskName ;
41+ this .sharedQueue = sharedQueue ;
42+ this .startIndex = startIndex ;
43+ }
44+
45+ @ Override
46+ public void run () {
47+ for (int job = this .startIndex ; job <= this .startIndex + 100 ; job ++){
48+ try {
49+ System .out .println ("" + this .taskName + " doing job " + job );
50+ sharedQueue .addElement (job );
51+ System .out .flush ();
52+ Thread .sleep (1000 );
53+ }catch (Exception exception ){
54+ System .err .println ("" + this .taskName + " error in doing job " +
55+ job + " details: " +exception .getMessage ());
56+ }
57+ }
58+ }
59+ }
60+
61+ class ReaderTask implements Runnable {
62+ private String taskName ;
63+ private static SharedQueue sharedQueue ;
64+
65+ public ReaderTask (String taskName , SharedQueue sharedQueue ){
66+ this .taskName = taskName ;
67+ this .sharedQueue = sharedQueue ;
68+ // this.startIndex = 1;
69+ }
70+
71+ @ Override
72+ public void run () {
73+ for (int job = 1 ; job <= 100 ; job ++){
74+ try {
75+ int result = sharedQueue .getElement ();
76+ System .out .println ("" + this .taskName + " iteration: " + job +" result: " +result );
77+ System .out .flush ();
78+ Thread .sleep (3000 );
79+ }catch (Exception exception ){
80+ System .err .println ("" + this .taskName + " error in doing job " + job );
81+ }
82+ }
83+ }
84+ }
85+
86+ class ThreadCommunication {
87+ public static void main (String [] args ) throws Exception {
88+ SharedQueue sharedQueue = new SharedQueue ();
89+
90+ WriterTask taskA = new WriterTask ("Writer task W1" , sharedQueue );
91+ Thread firstWriterThread = new Thread (taskA );
92+
93+ WriterTask taskB = new WriterTask ("Writer task W2" , sharedQueue , 101 );
94+ Thread secondWriterThread = new Thread (taskB );
95+
96+ firstWriterThread .start ();
97+ secondWriterThread .start ();
98+
99+ ReaderTask readerTask = new ReaderTask ("reader task R1 " , sharedQueue );
100+ Thread readerThread = new Thread (readerTask );
101+ readerThread .start ();
102+
103+ readerThread .join ();
104+ firstWriterThread .join ();
105+ secondWriterThread .join ();
106+
107+ }
108+ }
0 commit comments