added ex K
This commit is contained in:
		
							
								
								
									
										31
									
								
								src/exercises/ex_k/Customer.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/exercises/ex_k/Customer.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | package exercises.ex_k; | ||||||
|  |  | ||||||
|  | public class Customer implements Runnable { | ||||||
|  |     private String name; | ||||||
|  |     private PostOffice postOffice; | ||||||
|  |  | ||||||
|  |     public Customer(String name, PostOffice postOffice) { | ||||||
|  |         this.name = name; | ||||||
|  |         this.postOffice = postOffice; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getName() { | ||||||
|  |         return name; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void run() { | ||||||
|  |         Package pkg; | ||||||
|  |         while (true) { | ||||||
|  |             pkg = new Package(this); | ||||||
|  |             System.out.println("Registering " + pkg + "..."); | ||||||
|  |             postOffice.registerPackage(pkg); | ||||||
|  |             System.out.println("Registered " + pkg); | ||||||
|  |             try { | ||||||
|  |                 Thread.sleep((long) (Math.random() * 2000 + 1000)); | ||||||
|  |             } catch (InterruptedException e) { | ||||||
|  |                 throw new RuntimeException(e); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								src/exercises/ex_k/Package.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/exercises/ex_k/Package.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | package exercises.ex_k; | ||||||
|  |  | ||||||
|  | public class Package { | ||||||
|  |     private Customer sender; | ||||||
|  |  | ||||||
|  |     public Package(Customer sender) { | ||||||
|  |         this.sender = sender; | ||||||
|  |     } | ||||||
|  |     @Override | ||||||
|  |     public String toString() { | ||||||
|  |         return "Package{" + | ||||||
|  |             "sender=" + sender.getName() + | ||||||
|  |             '}'; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								src/exercises/ex_k/PostOffice.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/exercises/ex_k/PostOffice.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | package exercises.ex_k; | ||||||
|  |  | ||||||
|  | import java.util.LinkedList; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | public class PostOffice { | ||||||
|  |     public static final int CAPACITY = 5; | ||||||
|  |     private List<Package> packages = new LinkedList<>(); | ||||||
|  |  | ||||||
|  |     public synchronized void registerPackage(Package pkg) { | ||||||
|  |         while (packages.size() >= CAPACITY) { | ||||||
|  |             try { | ||||||
|  |                 System.out.println("[PostOffice] Storage is full, waiting"); | ||||||
|  |                 wait(); | ||||||
|  |             } catch (InterruptedException e) { | ||||||
|  |                 throw new RuntimeException(e); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         packages.add(pkg); | ||||||
|  |         System.out.println("[PostOffice] Storage: " + packages.size() + " / " + CAPACITY); | ||||||
|  |         notifyAll(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public synchronized Package getNextPackage() { | ||||||
|  |         while (packages.isEmpty()) { | ||||||
|  |             try { | ||||||
|  |                 System.out.println("[PostOffice] Storage is empty, waiting"); | ||||||
|  |                 wait(); | ||||||
|  |             } catch (InterruptedException e) { | ||||||
|  |                 throw new RuntimeException(e); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         Package pkg = packages.removeFirst(); | ||||||
|  |         System.out.println("[PostOffice] Storage: " + packages.size() + " / " + CAPACITY); | ||||||
|  |         notifyAll(); | ||||||
|  |         return pkg; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								src/exercises/ex_k/Postman.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/exercises/ex_k/Postman.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | package exercises.ex_k; | ||||||
|  |  | ||||||
|  | public class Postman implements Runnable { | ||||||
|  |     private PostOffice postOffice; | ||||||
|  |  | ||||||
|  |     public Postman(PostOffice postOffice) { | ||||||
|  |         this.postOffice = postOffice; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void run() { | ||||||
|  |         Package pkg; | ||||||
|  |         while (true) { | ||||||
|  |             pkg = postOffice.getNextPackage(); | ||||||
|  |             System.out.println("Delivering " + pkg); | ||||||
|  |             try { | ||||||
|  |                 Thread.sleep(2000); | ||||||
|  |             } catch (InterruptedException e) { | ||||||
|  |                 throw new RuntimeException(e); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								src/exercises/ex_k/TestingGuardedBlocks.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/exercises/ex_k/TestingGuardedBlocks.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | package exercises.ex_k; | ||||||
|  |  | ||||||
|  | public class TestingGuardedBlocks { | ||||||
|  |     public static void main(String[] args) { | ||||||
|  |         PostOffice postOffice = new PostOffice(); | ||||||
|  |         (new Thread(new Postman(postOffice))).start(); | ||||||
|  |         (new Thread(new Customer("Mrs Darbellay", postOffice))).start(); | ||||||
|  |         (new Thread(new Customer("Mrs Müller", postOffice))).start(); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user