So, let's start with a very basic example of multi-threading...a producer consumer implementation in Groovy in a classical way, with threads and synchronized blocks of code
**Producer class
class Producer { def name def products=[] private def Object lock; def Producer(name,products) { this.name = name; this.products=products } def produce() { def i=0 synchronized (this.lock) { println this.name + " starting to produce" while(true) { if (this.products.size()==2) { println this.name+" full stock, so wait" this.lock.notify() this.lock.wait() println this.products.size()+" more integers please" } else { i++ this.products.add("product "+i) } } } } }
**Consumer class
class Consumer { def name def products=[] def Object lock; def Consumer(name,products) { this.name = name; this.products=products } def consume() { synchronized (this.lock) { println "" println this.name + " starting to consume" while(true) { sleep(2000) if (this.products.size()>0) { def index=this.products.size()-1 println this.name+" consume "+this.products[index] this.products.remove(index) println "remains "+this.products.size() } else { println "is time for more integers" this.lock.notify() this.lock.wait() } } } } }
**And the main program which is the factory, the supermarket or something like this:). Of course for these example I am producing only some integers, not potatoes
class MainApplication { static main(args) { println "Hello world" def products=[] def a=new Producer("Producer",products) def lock=new Object(); def b=new Consumer("Consumer", products) a.lock=lock b.lock=lock def prodthread=Thread.start { a.produce() } def consThread=Thread.start { b.consume() } } }
Note: I'm not setting the lock object within the constructor, because i wanted to show you that private is just a simple word for the moment. This is a problem, but we can live with it right now... OOP, Java, groovy, producer consumer, grails, java frameworks, java language, groovy tutorial