java - Producer-Consumer multi threads syncing problems -
hello (first post)!
let me first i'm still relatively new programming in java (c++ strong point)
if has been answered please point me in right direction, search skills have yet yield looking for. problem running syncing between consumer threads , not between producer/consumer
my assignment consists of finding prime number candidates producer thread using multiple consumer threads check validity of each candidate:
using multiple threads, 1 producer thread puts 'candidates' arraylist (has arraylists) called prime_candidates, consumers grab arraylist , check
consumers check, if prime, set prime own arraylist prime_list
after 60 seconds prime_list written file , continues
i have synchronized prime_candidates consumer (check) threads. cannot life of me figure out how sync arraylists consumer threads produce. create own , using synchronized methods used producer/consumer doesn't work.
producer thread
import java.awt.color; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.math.biginteger; import java.util.arraylist; import java.util.date; import javax.swing.borderfactory; import javax.swing.jbutton; import javax.swing.jlabel; import javax.swing.jpanel; public class generatethread implements runnable{ // main array list stores numbers considered prime candidates private final arraylist<primecandidate> prime_candidates = new arraylist(); private boolean live = true; // main variable go on run thread private boolean toggle = true; // variable pauses producer // start: panel layout // jpanel genpanel = new jpanel(); jpanel lastpane = new jpanel(); jlabel lastoutput = new jlabel(); jpanel queuepane = new jpanel(); jlabel queueoutput = new jlabel(); jlabel headlabel = new jlabel("generate thread"); jlabel lastlabel = new jlabel("last"); jlabel queuelabel = new jlabel("queue"); jbutton pausebutton = new jbutton("pause"); jbutton terminatebutton = new jbutton("terminate"); // end: panel layout // // default constructor, doesn't much generatethread(){ system.out.println("creating generator");} public jpanel createpanel() { // set black border around panels holding current size , // prime candidate lastpane.setborder(borderfactory.createlineborder(color.black)); queuepane.setborder(borderfactory.createlineborder(color.black)); // add together listener terminate thread terminatebutton.addactionlistener(new terminatelistener()); // add together listener pause thread pausebutton.addactionlistener(new pauselistener()); lastpane.add(lastoutput); queuepane.add(queueoutput); genpanel.add(headlabel); genpanel.add(lastlabel); genpanel.add(lastpane); genpanel.add(queuelabel); genpanel.add(queuepane); genpanel.add(pausebutton); genpanel.add(terminatebutton); homecoming genpanel; } @override public void run() { long = 3; while(alive) { if(toggle) { if(i % 2 == 1) if(!testforprime.isdividableby3(biginteger.valueof(i))) { addtoarraylist(biginteger.valueof(i)); lastoutput.settext(biginteger.valueof(i).tostring()); queueoutput.settext(biginteger.valueof(prime_candidates.size()).tostring()); } i++; } if(!toggle)continuenotifying(); } while(!alive){continuenotifying();} } // adds new item arraylist , notifys threads dependent on arraylist public synchronized void addtoarraylist(biginteger b) { prime_candidates.add(new primecandidate(b, new date())); notify(); } // continues notifying other threads when paused or terminated since // not run unless have been given 'go ahead' (notify()) public synchronized void continuenotifying() { queueoutput.settext(biginteger.valueof(prime_candidates.size()).tostring()); notify(); } // used other threads items array list, threads delete // variable grab, cutting array list downwards every // time public synchronized primecandidate getfromarraylist() throws interruptedexception { wait(); //keeps thread adding more list while others grabbing primecandidate returncandidate = new primecandidate(prime_candidates.get(0)); prime_candidates.remove(0); homecoming returncandidate; } // listener kill thread prime candidate producer // greys out both buttons show thread dead class terminatelistener implements actionlistener { @override public void actionperformed(actionevent e) { terminatebutton.setenabled(false); pausebutton.setenabled(false); live = false; } } // listener temporarily stop producer class pauselistener implements actionlistener { @override public void actionperformed(actionevent e) { if(toggle) pausebutton.settext("start"); if(!toggle) pausebutton.settext("pause"); toggle = !toggle; } } }
consumer thread
import java.awt.color; import java.awt.dimension; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.io.bufferedwriter; import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.io.outputstreamwriter; import java.io.writer; import java.util.arraylist; import java.util.date; import javax.swing.borderfactory; import javax.swing.jbutton; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.timer; public class checkthread implements runnable{ private final generatethread generated; private arraylist<primes> prime_list = new arraylist(); //private copyonwritearraylist<primes> prime_list = new copyonwritearraylist(); private final string threadname; private boolean live = true; private boolean toggle = true; private date timefetched; private date timefound; private primes currentprime; // start: panel layout // jpanel genpanel = new jpanel(); jpanel lastpane = new jpanel(); jlabel lastoutput = new jlabel(); jpanel queuepane = new jpanel(); jlabel queueoutput = new jlabel(); jlabel headlabel = new jlabel("generate thread"); jlabel lastlabel = new jlabel("last"); jlabel queuelabel = new jlabel("in work"); jbutton pausebutton = new jbutton("pause"); jbutton terminatebutton = new jbutton("terminate"); // end: panel layout // checkthread(generatethread gen, string name, int priority) { generated = gen; threadname = name; headlabel.settext(name); system.out.println("creating | " + name); if(priority == 0) { system.out.println(name + " writing thread"); final timer t = new timer(10000, new writetofiletimer()); t.start(); } } public jpanel createpanel() { lastpane.setborder(borderfactory.createlineborder(color.black)); lastpane.setminimumsize(new dimension(200,100)); queuepane.setborder(borderfactory.createlineborder(color.black)); terminatebutton.addactionlistener(new terminatelistener()); pausebutton.addactionlistener(new pauselistener()); lastpane.add(lastoutput); queuepane.add(queueoutput); genpanel.add(headlabel); genpanel.add(lastlabel); genpanel.add(lastpane); genpanel.add(queuelabel); genpanel.add(queuepane); genpanel.add(pausebutton); genpanel.add(terminatebutton); lastoutput.setignorerepaint(true); homecoming genpanel; } class writetofiletimer implements actionlistener { @override public void actionperformed(actionevent event) { try{ writetofile();}catch (interruptedexception e) { system.out.println("wtf");} } } @override public void run() { while(alive) { seek { if(toggle) { primecandidate recieved = new primecandidate(generated.getfromarraylist()); timefetched = new date(); //queueoutput.settext(recieved.getcandidate().tostring()); if(testforprime.isprime(recieved.getcandidate())) { lastoutput.settext(recieved.getcandidate().tostring()); timefound = new date(); string temp = "" + prime_list.size(); queueoutput.settext(temp); addtoarraylist(new primes(recieved.getcandidate(),recieved.gettimestamp(), timefetched)); } } } grab (interruptedexception e) {} } } class terminatelistener implements actionlistener { @override public void actionperformed(actionevent e) { terminatebutton.setenabled(false); pausebutton.setenabled(false); live = false; } } class pauselistener implements actionlistener { @override public void actionperformed(actionevent e) { if(toggle) pausebutton.settext("start"); if(!toggle) pausebutton.settext("pause"); toggle = !toggle; } } // adds new item arraylist , notifys threads dependent on arraylist public synchronized void addtoarraylist(primes primefound) { prime_list.add(primefound); } // used other threads items array list, threads delete // variable grab, cutting array list downwards every // time public synchronized void writetofile() throws interruptedexception { wait(); seek { file stattext = new file("prime_numbers.txt"); fileoutputstream = new fileoutputstream(stattext); outputstreamwriter osw = new outputstreamwriter(is); author writ = new bufferedwriter(osw); while(!prime_list.isempty()) { writ.append(prime_list.get(0).tostring()); prime_list.remove(0); } writ.close(); headlabel.settext(threadname); } grab (ioexception e) {system.err.println(" failed write test.txt");} notify(); } }
i know code sick written assignment maintain running wall , rewriting code scratch , have stopped caring. know how can sync prime_list arraylist in consumer threads. if didn't notice built each array list add together each thread/panel main frame. works flawlessy in terms of getting , checking of primes current headache writing file threads have produced. can write each thread individually file end on writing each other everytime
if understood correctly need accumulated prime numbers of consumers written file every 60 second.
for using prime_list instance variable multiple threads have own prime_list. can mark prime_list static , methods access static. , within methods code must within of synchronized blocks.
this not best design. if write origin won't utilize design work you.
import java.awt.color; import java.awt.dimension; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.io.bufferedwriter; import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.io.outputstreamwriter; import java.io.writer; import java.util.arraylist; import java.util.date; import javax.swing.borderfactory; import javax.swing.jbutton; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.timer; public class checkthread implements runnable{ private final generatethread generated; private static arraylist<primes> prime_list = new arraylist(); //private copyonwritearraylist<primes> prime_list = new copyonwritearraylist(); private final string threadname; private boolean live = true; private boolean toggle = true; private date timefetched; private date timefound; private primes currentprime; // start: panel layout // jpanel genpanel = new jpanel(); jpanel lastpane = new jpanel(); jlabel lastoutput = new jlabel(); jpanel queuepane = new jpanel(); jlabel queueoutput = new jlabel(); jlabel headlabel = new jlabel("generate thread"); jlabel lastlabel = new jlabel("last"); jlabel queuelabel = new jlabel("in work"); jbutton pausebutton = new jbutton("pause"); jbutton terminatebutton = new jbutton("terminate"); // end: panel layout // checkthread(generatethread gen, string name, int priority) { generated = gen; threadname = name; headlabel.settext(name); system.out.println("creating | " + name); if(priority == 0) { system.out.println(name + " writing thread"); final timer t = new timer(10000, new writetofiletimer()); t.start(); } } public jpanel createpanel() { lastpane.setborder(borderfactory.createlineborder(color.black)); lastpane.setminimumsize(new dimension(200,100)); queuepane.setborder(borderfactory.createlineborder(color.black)); terminatebutton.addactionlistener(new terminatelistener()); pausebutton.addactionlistener(new pauselistener()); lastpane.add(lastoutput); queuepane.add(queueoutput); genpanel.add(headlabel); genpanel.add(lastlabel); genpanel.add(lastpane); genpanel.add(queuelabel); genpanel.add(queuepane); genpanel.add(pausebutton); genpanel.add(terminatebutton); lastoutput.setignorerepaint(true); homecoming genpanel; } class writetofiletimer implements actionlistener { @override public void actionperformed(actionevent event) { try{ writetofile();}catch (interruptedexception e) { system.out.println("wtf");} } } @override public void run() { while(alive) { seek { if(toggle) { primecandidate recieved = new primecandidate(generated.getfromarraylist()); timefetched = new date(); //queueoutput.settext(recieved.getcandidate().tostring()); if(testforprime.isprime(recieved.getcandidate())) { lastoutput.settext(recieved.getcandidate().tostring()); timefound = new date(); string temp = "" + prime_list.size(); queueoutput.settext(temp); addtoarraylist(new primes(recieved.getcandidate(),recieved.gettimestamp(), timefetched)); } } } grab (interruptedexception e) {} } } class terminatelistener implements actionlistener { @override public void actionperformed(actionevent e) { terminatebutton.setenabled(false); pausebutton.setenabled(false); live = false; } } class pauselistener implements actionlistener { @override public void actionperformed(actionevent e) { if(toggle) pausebutton.settext("start"); if(!toggle) pausebutton.settext("pause"); toggle = !toggle; } } // adds new item arraylist , notifys threads dependent on arraylist public static void addtoarraylist(primes primefound) { synchronized(prime_list) { // added prime_list.add(primefound); } } // used other threads items array list, threads delete // variable grab, cutting array list downwards every // time public static void writetofile() throws interruptedexception { synchronized(prime_list) { // added seek { file stattext = new file("prime_numbers.txt"); fileoutputstream = new fileoutputstream(stattext); outputstreamwriter osw = new outputstreamwriter(is); author writ = new bufferedwriter(osw); for(int i=0;i<prime_list.size();i++) { writ.append(prime_list.get(i)); } prime_list.clear(); writ.close(); headlabel.settext(threadname); } grab (ioexception e) {system.err.println(" failed write test.txt");} } } }
java multithreading arraylist synchronization
No comments:
Post a Comment