diff --git a/JavaMultiThreadingCodes/src/CallableAndFuture_13/App.java b/JavaMultiThreadingCodes/src/CallableAndFuture_13/App.java index 46c2a9b..33624a8 100644 --- a/JavaMultiThreadingCodes/src/CallableAndFuture_13/App.java +++ b/JavaMultiThreadingCodes/src/CallableAndFuture_13/App.java @@ -1,67 +1,70 @@ package CallableAndFuture_13; +import java.util.Random; +import java.util.concurrent.*; + /** - * Callable and Future in Java to get results from your threads and to allow + * {@link java.util.concurrent.Callable} and + * {@link java.util.concurrent.Future} + * in Java to get results from your threads and to allow * your threads to throw exceptions. Plus, Future allows you to control your * threads, checking to see if they’re running or not, waiting for results and - * even interrupting them or descheduling them. - * - * Runnable is default abstraction for creating a task in Java. It has a single - * method run() that accepts no arguments and returns no value, nor it can throw + * even interrupting them or de-scheduling them. + *

+ * {@link java.lang.Runnable} + * is the default abstraction for creating a task in Java. It has a single + * method {@link Runnable#run()} + * that accepts no arguments and returns no value, nor it can throw * any checked exception. To overcome these limitations, Java 5 introduced a new - * task abstraction through Callable interface. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * task abstraction through {@link java.util.concurrent.Callable} interface. + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ -import java.io.IOException; -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; - public class App { public static void main(String[] args) throws InterruptedException { ExecutorService executor = Executors.newCachedThreadPool(); + //anonymous call of Callable Future future = executor.submit(new Callable() { @Override //return value is Integer - public Integer call() throws Exception { + public Integer call() throws TimeoutException { Random random = new Random(); int duration = random.nextInt(4000); if (duration > 2000) { - throw new IOException("Sleeping for too long."); + throw new TimeoutException ("Sleeping for too long."); } - System.out.println("Starting ..."); + System.out.println("Starting ..."); try { Thread.sleep(duration); - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} System.out.println("Finished."); return duration; } }); executor.shutdown(); - executor.awaitTermination(1, TimeUnit.DAYS); +// executor.awaitTermination(1, TimeUnit.DAYS); try { //get returned value from call() System.out.println("Result is: " + future.get()); - } catch (InterruptedException e) { - e.printStackTrace(); + + } catch (InterruptedException ignored) { } catch (ExecutionException e) { - IOException ex = (IOException) e.getCause(); + TimeoutException ex = (TimeoutException) e.getCause(); System.out.println(ex.getMessage()); } } diff --git a/JavaMultiThreadingCodes/src/CallableAndFuture_13/App2.java b/JavaMultiThreadingCodes/src/CallableAndFuture_13/App2.java index 426b95b..3fb721b 100644 --- a/JavaMultiThreadingCodes/src/CallableAndFuture_13/App2.java +++ b/JavaMultiThreadingCodes/src/CallableAndFuture_13/App2.java @@ -1,23 +1,18 @@ package CallableAndFuture_13; +import java.util.ArrayList; +import java.util.concurrent.*; + /** * Understanding Callable * * @author Z.B. Celik */ -import java.util.ArrayList; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; - class MyCallable implements Callable { - Integer value; + int value; - public MyCallable(Integer i) { + public MyCallable(int i) { this.value = i; } @@ -38,8 +33,8 @@ public class App2 { public static void main(String[] args) throws InterruptedException { ArrayList list = new ArrayList<>(); ExecutorService executor = Executors.newCachedThreadPool(); - Future future = null; - Callable callable = null; + Future future; + for (int i = 1; i < 10; i++) { future = executor.submit(new MyCallable(i)); try { @@ -50,7 +45,9 @@ public static void main(String[] args) throws InterruptedException { } executor.shutdown(); + //this is ont necessary in this case .. but .. good practice :) executor.awaitTermination(1, TimeUnit.DAYS); + for (int i = 0; i < list.size(); i++) { //get returned values from call() System.out.println("List Values " + i + " Value: " + list.get(i)); diff --git a/JavaMultiThreadingCodes/src/CallableAndFuture_13/CallableTester.java b/JavaMultiThreadingCodes/src/CallableAndFuture_13/CallableTester.java index 29c75aa..eb9779c 100644 --- a/JavaMultiThreadingCodes/src/CallableAndFuture_13/CallableTester.java +++ b/JavaMultiThreadingCodes/src/CallableAndFuture_13/CallableTester.java @@ -1,33 +1,47 @@ package CallableAndFuture_13; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.*; /** - * Source:http://java-x.blogspot.com.tr/2006/11/java-5-concurrency-callable-and-future.html - * Till Java 1.4, threads could be implemented by either implementing Runnable - * or extending Thread. This was quite simple, but had a serious limitation - + * Source: + * + * http://java-x.blogspot.com.tr/2006/11/java-5-concurrency-callable-and-future.html + * + *

+ * Till Java 1.4, threads could be implemented by either implementing + * {@link java.lang.Runnable} or extending {@link java.lang.Thread}. + * This was quite simple, but had a serious limitation; * They have a run method that cannot return values. In order to side-step this, * most programmers use side-effects (writing to a file etc.) to mimic returning - * values to the invoker of the thread. Java 5 introduces the Callable - * interface, that allows users to return values from a thread - * - * Runnable vs Callable - * Runnable Introduced in Java 1.0 Callable Introduced in Java 1.5 as part of - * java.util.concurrent library - * - * Runnable cannot be parameterized Callable is a parameterized type whose type - * parameter indicates the return type of its run method Classes implementing - * + * values to the invoker of the thread. Java 5 introduces the + * {@link java.util.concurrent.Callable} interface, that allows users to + * return values from a thread. + *

+ *

+ * {@link java.lang.Runnable} vs {@link java.util.concurrent.Callable} : + *

+ *

* * @author Z.B. Celik */ @@ -58,7 +72,7 @@ public void setMyName(int myName) { public class CallableTester { - public static void main(String[] args) { + public static void main(String[] args) throws InterruptedException { Callable callable = new CallableImpl(2); ExecutorService executor = new ScheduledThreadPoolExecutor(1); @@ -66,12 +80,9 @@ public static void main(String[] args) { try { System.out.println("Future value: " + future.get()); - } catch (Exception e) { - e.printStackTrace(); - } finally { - executor.shutdown(); - executor.isTerminated(); - } + } catch (Exception ignored) {} + executor.shutdown(); + executor.awaitTermination(1, TimeUnit.HOURS); } } diff --git a/JavaMultiThreadingCodes/src/CountDownLatch_6/App.java b/JavaMultiThreadingCodes/src/CountDownLatch_6/App.java index 646efe7..20164d7 100644 --- a/JavaMultiThreadingCodes/src/CountDownLatch_6/App.java +++ b/JavaMultiThreadingCodes/src/CountDownLatch_6/App.java @@ -5,30 +5,34 @@ import java.util.concurrent.Executors; /** - * CountDownLatch Java class to synchronize your threads’ activities. - * + * {@link java.util.concurrent.CountDownLatch} Java class to synchronize your threads’ activities. + *

* Source: - * (http://stackoverflow.com/questions/17827022/what-is-countdown-latch-in-java-multithreading) + * http://stackoverflow.com/questions/17827022/what-is-countdown-latch-in-java-multithreading
+ * * Any thread, usually main thread of application, which calls - * CountDownLatch.await() will wait until count reaches zero or its interrupted + * {@link java.util.concurrent.CountDownLatch#await()} will wait until count reaches zero or its interrupted * by another thread. All other thread are required to do count down by calling - * CountDownLatch.countDown() once they are completed or ready. - * + * {@link java.util.concurrent.CountDownLatch#countDown()} once they are completed or ready. + *
* As soon as count reaches zero, Thread awaiting starts running. One of the - * disadvantage of CountDownLatch is that its not reusable once count reaches to - * zero you can not use CountDownLatch any more. - * - * Use CountDownLatch when one thread like main thread, require to wait for one - * or more thread to complete, before it can start processing. - * - * Classical example of using CountDownLatch in Java is any server side core - * Java application which uses services architecture, where multiple services + * disadvantage of {@link java.util.concurrent.CountDownLatch} is that it's + * not reusable once the count reaches to + * zero you can not use {@link java.util.concurrent.CountDownLatch} any more. + *

+ * Use {@link java.util.concurrent.CountDownLatch} when one thread, like main + * thread, require to wait for one or more threads to complete, before it can + * start processing. + *

+ * Classical example of using {@link java.util.concurrent.CountDownLatch} in + * Java is any server side core Java application which uses services + * architecture, where multiple services * are provided by multiple threads and application can not start processing * until all services have started successfully. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from http://www.caveofprogramming.com/youtube/
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * https://www.udemy.com/java-multithreading/?couponCode=FREE * * @author Z.B. Celik */ @@ -45,10 +49,7 @@ public void run() { try { Thread.sleep(3000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} latch.countDown(); } } @@ -61,8 +62,10 @@ public static void main(String[] args) { for (int i = 0; i < 3; i++) { executor.submit(new Processor(latch)); } + executor.shutdown(); + try { - // Application’s main thread waits, till other service threads which are + // Application’s main thread waits, till other service threads which are // as an example responsible for starting framework services have completed started all services. latch.await(); } catch (InterruptedException e) { diff --git a/JavaMultiThreadingCodes/src/Deadlock_11/Account.java b/JavaMultiThreadingCodes/src/Deadlock_11/Account.java index ff7c4a7..53a1bff 100644 --- a/JavaMultiThreadingCodes/src/Deadlock_11/Account.java +++ b/JavaMultiThreadingCodes/src/Deadlock_11/Account.java @@ -1,9 +1,15 @@ package Deadlock_11; /** - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ diff --git a/JavaMultiThreadingCodes/src/Deadlock_11/App.java b/JavaMultiThreadingCodes/src/Deadlock_11/App.java index 3f5c797..34b51a6 100644 --- a/JavaMultiThreadingCodes/src/Deadlock_11/App.java +++ b/JavaMultiThreadingCodes/src/Deadlock_11/App.java @@ -1,16 +1,23 @@ package Deadlock_11; /** - * Deadlock can occur in a situation when a thread is waiting for an object - * lock, that is acquired by another thread and second thread is waiting for an + * Deadlock + * can occur in a situation when a thread is waiting for an object's lock, + * that is acquired by another thread and the second thread is waiting for an * object lock that is acquired by first thread. Since, both threads are waiting * for each other to release the lock, the condition is called deadlock. If you * make sure that all locks are always taken in the same order by any thread, * deadlocks cannot occur. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -22,10 +29,7 @@ public static void main(String[] args) throws Exception { public void run() { try { runner.firstThread(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); @@ -33,10 +37,7 @@ public void run() { public void run() { try { runner.secondThread(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); @@ -46,5 +47,4 @@ public void run() { t2.join(); runner.finished(); } - } diff --git a/JavaMultiThreadingCodes/src/Deadlock_11/Runner.java b/JavaMultiThreadingCodes/src/Deadlock_11/Runner.java index f293f41..970a867 100644 --- a/JavaMultiThreadingCodes/src/Deadlock_11/Runner.java +++ b/JavaMultiThreadingCodes/src/Deadlock_11/Runner.java @@ -1,18 +1,25 @@ - package Deadlock_11; +package Deadlock_11; + +import java.util.Random; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; /** - * Deadlocks - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * Deadlock + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ -import java.util.Random; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - +@SuppressWarnings("InfiniteLoopStatement") public class Runner { private Account acc1 = new Account(); @@ -38,22 +45,16 @@ private void acquireLocks(Lock firstLock, Lock secondLock) throws InterruptedExc gotFirstLock = firstLock.tryLock(); gotSecondLock = secondLock.tryLock(); } finally { - if (gotFirstLock && gotSecondLock) { - return; - } - if (gotFirstLock) { - firstLock.unlock(); - } - if (gotSecondLock) { - secondLock.unlock(); - } + if (gotFirstLock && gotSecondLock) return; + else if (gotFirstLock) firstLock.unlock(); + else if (gotSecondLock) secondLock.unlock(); } // Locks not acquired Thread.sleep(1); } } - //firstThreaad runs + //firstThread runs public void firstThread() throws InterruptedException { Random random = new Random(); for (int i = 0; i < 10000; i++) { diff --git a/JavaMultiThreadingCodes/src/Deadlock_11/SimpleDeadLock.java b/JavaMultiThreadingCodes/src/Deadlock_11/SimpleDeadLock.java index 47f769a..9ad7f65 100644 --- a/JavaMultiThreadingCodes/src/Deadlock_11/SimpleDeadLock.java +++ b/JavaMultiThreadingCodes/src/Deadlock_11/SimpleDeadLock.java @@ -2,7 +2,9 @@ /** * Source: http://www.herongyang.com/Java/Deadlock-What-Is-Deadlock.html - * Deadlock is a programming situation where two or more threads are blocked + *

+ * Deadlock + * is a programming situation where two or more threads are blocked * forever, this situation arises with at least two threads and two or more * resources. * @@ -10,8 +12,8 @@ */ public class SimpleDeadLock { - public static Object lock1 = new Object(); - public static Object lock2 = new Object(); + public static final Object lock1 = new Object(); + public static final Object lock2 = new Object(); private int index; public static void main(String[] a) { @@ -28,8 +30,7 @@ public void run() { System.out.println("Thread 1: Holding lock 1..."); try { Thread.sleep(10); - } catch (InterruptedException e) { - } + } catch (InterruptedException ignored) {} System.out.println("Thread 1: Waiting for lock 2..."); synchronized (lock2) { System.out.println("Thread 2: Holding lock 1 & 2..."); @@ -45,8 +46,7 @@ public void run() { System.out.println("Thread 2: Holding lock 2..."); try { Thread.sleep(10); - } catch (InterruptedException e) { - } + } catch (InterruptedException ignored) {} System.out.println("Thread 2: Waiting for lock 1..."); synchronized (lock1) { System.out.println("Thread 2: Holding lock 2 & 1..."); diff --git a/JavaMultiThreadingCodes/src/InterruptingThreads14/App.java b/JavaMultiThreadingCodes/src/InterruptingThreads14/App.java index f36769c..a843f1e 100644 --- a/JavaMultiThreadingCodes/src/InterruptingThreads14/App.java +++ b/JavaMultiThreadingCodes/src/InterruptingThreads14/App.java @@ -1,27 +1,31 @@ package InterruptingThreads14; -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; /** - * how to interrupt running threads in Java using the built-in thread - * interruption mechanism. - * - * Source:http://www.javamex.com/tutorials/threads/thread_interruption.shtml - * Incidentally, it is important not to confuse thread interruption with either + * How to interrupt running threads in Java using the built-in thread + * interruption mechanism. + *

+ * Source: + * + * http://www.javamex.com/tutorials/threads/thread_interruption.shtml + *

+ * Incidentally, it is important NOT to confuse thread interruption with either * software interrupts (where the CPU automatically interrupts the current * instruction flow in order to call a registered piece of code periodically— as * in fact happens to drive the thread scheduler) and hardware interrupts (where * the CPU automatically performs a similar task in response to some hardware * signal). - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -31,29 +35,39 @@ public static void main(String[] args) throws InterruptedException { System.out.println("Starting."); - ExecutorService executer = Executors.newCachedThreadPool(); + ExecutorService executor = Executors.newCachedThreadPool(); - Future fu = executer.submit(new Callable() { + Future fu = executor.submit(new Callable() { @Override public Void call() throws Exception { - Random ran = new Random(); + for (int i = 0; i < 1E8; i++) { if (Thread.currentThread().isInterrupted()) { - System.out.println("Interrupted!"); + System.out.printf("Interrupted at %d !!!", i); break; } - Math.sin(ran.nextDouble()); } + return null; } }); - executer.shutdown(); + executor.shutdown(); Thread.sleep(500); - executer.shutdownNow(); - executer.awaitTermination(1, TimeUnit.DAYS); + /* + in this example, there are different ways you can interrupt a thread + execution. + */ + + //JavaDoc: http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#cancel-boolean- +// fu.cancel(true); + + //JavaDoc: http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#shutdownNow-- + executor.shutdownNow(); + + executor.awaitTermination(1, TimeUnit.DAYS); System.out.println("Finished."); } diff --git a/JavaMultiThreadingCodes/src/JoiningAndSynchronizeThreads_3/Worker.java b/JavaMultiThreadingCodes/src/JoiningAndSynchronizeThreads_3/Worker.java index d2bb0c3..e89df8a 100644 --- a/JavaMultiThreadingCodes/src/JoiningAndSynchronizeThreads_3/Worker.java +++ b/JavaMultiThreadingCodes/src/JoiningAndSynchronizeThreads_3/Worker.java @@ -4,12 +4,18 @@ import java.util.logging.Logger; /** - * synchronized ("only let one thread in here at a time".) and join ("wait until + * {@code synchronized} ("only let one thread in here at a time".) and {@code join} ("wait until * thread on which join has called finished") keyword. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -70,10 +76,7 @@ public void run() { try { thread1.join(); thread2.join(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} System.out.println("Count is: " + count); } } diff --git a/JavaMultiThreadingCodes/src/LockObjects_4/App.java b/JavaMultiThreadingCodes/src/LockObjects_4/App.java index 96b6a13..c7941fb 100644 --- a/JavaMultiThreadingCodes/src/LockObjects_4/App.java +++ b/JavaMultiThreadingCodes/src/LockObjects_4/App.java @@ -1,9 +1,15 @@ package LockObjects_4; /** - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ diff --git a/JavaMultiThreadingCodes/src/LockObjects_4/Worker.java b/JavaMultiThreadingCodes/src/LockObjects_4/Worker.java index ae381bb..70ad012 100644 --- a/JavaMultiThreadingCodes/src/LockObjects_4/Worker.java +++ b/JavaMultiThreadingCodes/src/LockObjects_4/Worker.java @@ -10,10 +10,16 @@ * making the method synchronized or making an object inside the method * synchronized, By defining two different locks we say that one thread may * execute the stageOne while other executes stageTwo. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -21,11 +27,11 @@ public class Worker { private Random random = new Random(); - private Object lock1 = new Object(); - private Object lock2 = new Object(); + private final Object lock1 = new Object(); + private final Object lock2 = new Object(); - private List list1 = new ArrayList(); - private List list2 = new ArrayList(); + private List list1 = new ArrayList<>(); + private List list2 = new ArrayList<>(); public void stageOne() { diff --git a/JavaMultiThreadingCodes/src/LockObjects_4/WorkerMethodsSynchronized.java b/JavaMultiThreadingCodes/src/LockObjects_4/WorkerMethodsSynchronized.java index 5b7ac30..c01b492 100644 --- a/JavaMultiThreadingCodes/src/LockObjects_4/WorkerMethodsSynchronized.java +++ b/JavaMultiThreadingCodes/src/LockObjects_4/WorkerMethodsSynchronized.java @@ -10,10 +10,16 @@ * making the method synchronized or making "different" objects inside the * method synchronized, By defining two different locks we say that one thread * may execute the stageOne while other executes stageTwo. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -21,8 +27,8 @@ public class WorkerMethodsSynchronized { private Random random = new Random(); - private List list1 = new ArrayList(); - private List list2 = new ArrayList(); + private List list1 = new ArrayList<>(); + private List list2 = new ArrayList<>(); /** * synchronized, methods use different data (list1 list2) so by synchronized @@ -78,10 +84,7 @@ public void run() { try { t1.join(); t2.join(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} long end = System.currentTimeMillis(); diff --git a/JavaMultiThreadingCodes/src/LowLevelProducerConsumer_9/App.java b/JavaMultiThreadingCodes/src/LowLevelProducerConsumer_9/App.java index 99eb416..aabbfd3 100644 --- a/JavaMultiThreadingCodes/src/LowLevelProducerConsumer_9/App.java +++ b/JavaMultiThreadingCodes/src/LowLevelProducerConsumer_9/App.java @@ -1,15 +1,22 @@ package LowLevelProducerConsumer_9; /** - * How to implement the producer-consumer pattern using "low level" techniques; + * How to implement the Producer-Consumer pattern using "low level" techniques; * namely, wait, notify and synchronized. This isn't the best way to implement a - * producer-consumer pattern in Java (see tutorial 7 use of BlockingQueue for + * Producer-Consumer pattern in Java + * (see tutorial 7 use of {@link java.util.concurrent.BlockingQueue} for * the best way); but this tutorial will help you to understand how to use wait * and notify. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -22,9 +29,7 @@ public static void main(String[] args) throws InterruptedException { public void run() { try { processor.produce(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); @@ -33,14 +38,18 @@ public void run() { public void run() { try { processor.consume(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); + t1.start(); t2.start(); - t1.join(); - t2.join(); +// t1.join(); +// t2.join(); + + // Pause for 30 seconds and force quitting the app (because we're + // looping infinitely) + Thread.sleep(30000); + System.exit(0); } } diff --git a/JavaMultiThreadingCodes/src/LowLevelProducerConsumer_9/Processor.java b/JavaMultiThreadingCodes/src/LowLevelProducerConsumer_9/Processor.java index a93ba04..e061c1d 100644 --- a/JavaMultiThreadingCodes/src/LowLevelProducerConsumer_9/Processor.java +++ b/JavaMultiThreadingCodes/src/LowLevelProducerConsumer_9/Processor.java @@ -1,26 +1,33 @@ package LowLevelProducerConsumer_9; +import java.util.LinkedList; +import java.util.Random; + /** - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ -import java.util.LinkedList; -import java.util.Random; - +@SuppressWarnings("InfiniteLoopStatement") public class Processor { private LinkedList list = new LinkedList<>(); private final int LIMIT = 10; - private Object lock = new Object(); + private final Object lock = new Object(); public void produce() throws InterruptedException { int value = 0; while (true) { synchronized (lock) { - //whenever the threade is notofied starts again from the loop + //whenever the thread is notified starts again from the loop while (list.size() == LIMIT) { lock.wait();// wait() is also true } diff --git a/JavaMultiThreadingCodes/src/ProducerConsumer_7/App.java b/JavaMultiThreadingCodes/src/ProducerConsumer_7/App.java index 7440082..b064da4 100644 --- a/JavaMultiThreadingCodes/src/ProducerConsumer_7/App.java +++ b/JavaMultiThreadingCodes/src/ProducerConsumer_7/App.java @@ -1,14 +1,22 @@ package ProducerConsumer_7; /** - * producer-consumer pattern in Java using the ArrayBlockingQueue Java class. + * Producer-Consumer pattern in Java using the {@link java.util.concurrent + * .ArrayBlockingQueue} Java class. + *

* Producer-Consumer is the situation where one or more threads are producing * data items and adding them to a shared data store of some kind while one or * more other threads process those items, removing them from the data store. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -16,32 +24,31 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; +@SuppressWarnings("InfiniteLoopStatement") public class App { /** - * Thread safe implementation of Queue data structure so you do not need to - * worry about synchronization. More specifically BlockingQueue + * Thread safe implementation of {@link java.util.Queue} data structure so + * you do not need to worry about synchronization. + * More specifically {@link java.util.concurrent.BlockingQueue} * implementations are thread-safe. All queuing methods are atomic in nature * and use internal locks or other forms of concurrency control. If * BlockingQueue is not used queue is shared data structure either - * sychronized or wait() notify() (see Course 8) should be used. Java 1.5 - * introduced a new concurrency library (in the java.util.concurrent - * package) which was designed to provide a higher level abstraction over + * {@code synchronized} or {@code wait() notify()} (see Course 8) should be + * used. + * Java 1.5 introduced a new concurrency library {@link java.util.concurrent} + * which was designed to provide a higher level abstraction over * the wait/notify mechanism. */ private static BlockingQueue queue = new ArrayBlockingQueue<>(10); public static void main(String[] args) throws InterruptedException { - /** - * - */ + Thread t1 = new Thread(new Runnable() { public void run() { try { producer(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); @@ -49,16 +56,18 @@ public void run() { public void run() { try { consumer(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); t1.start(); t2.start(); - t1.join(); - t2.join(); +// t1.join(); +// t2.join(); + + // Pause for 30 seconds and force quitting the app (because we're + // looping infinitely) + Thread.sleep(30000); + System.exit(0); } private static void producer() throws InterruptedException { @@ -71,7 +80,7 @@ private static void producer() throws InterruptedException { private static void consumer() throws InterruptedException { Random random = new Random(); while (true) { - //Thread.sleep(100); + Thread.sleep(100); if (random.nextInt(10) == 0) { Integer value = queue.take();//if queue is empty waits System.out.println("Taken value: " + value + "; Queue size is: " + queue.size()); diff --git a/JavaMultiThreadingCodes/src/ReentrantLocks_10/App.java b/JavaMultiThreadingCodes/src/ReentrantLocks_10/App.java index 96a43b8..845fbe7 100644 --- a/JavaMultiThreadingCodes/src/ReentrantLocks_10/App.java +++ b/JavaMultiThreadingCodes/src/ReentrantLocks_10/App.java @@ -1,36 +1,68 @@ package ReentrantLocks_10; /** - * the ReentrantLock class in Java as an alternative to synchronized code - * blocks. ReentrantLocks let you do all the stuff that you can do with - * synchronized, wait and notify, plus some more stuff besides that may come in + * the {@link java.util.concurrent.locks.ReentrantLock} class in Java as an + * alternative to synchronized code blocks. + *
+ * {@link java.util.concurrent.locks.ReentrantLock}s let you do all the + * stuff that you can do with {@code synchronized}, {@link Object#wait()} and + * {@link Object#notify()}, plus some more stuff. Besides that may come in * handy from time to time. - * - * Source: + *

+ * Source: * http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html - * - * ReentrantLock Extended capabilities include: - * - * The ability to have more than one condition variable per monitor. Monitors - * that use the synchronized keyword can only have one. This means reentrant - * locks support more than one wait()/notify() queue. The ability to make the - * lock "fair". "[fair] locks favor granting access to the longest-waiting + * + *

+ * {@link java.util.concurrent.locks.ReentrantLock} Extended capabilities + * include: + *
+ *

    + *
  • + * The ability to have more than one {@link java.util.concurrent.locks.Condition} + * variable per monitor. + *
  • + *
  • Monitors that use the synchronized keyword can only have one. This means + * {@link java.util.concurrent.locks.ReentrantLock}s support more than one + * {@link Object#wait()}/{@link Object#notify()} queue. + *
  • + *
  • + * The ability to make the lock "fair". + * + * "[fair] locks favor granting access to the longest-waiting * thread. Otherwise this lock does not guarantee any particular access order." - * Synchronized blocks are unfair. The ability to check if the lock is being - * held. The ability to get the list of threads waiting on the lock. - * - * The disadvantages of reentrant locks are: - * - * Need to add import statement. Need to wrap lock acquisitions in a try/finally - * block. This makes it more ugly than the synchronized keyword. The - * synchronized keyword can be put in method definitions which avoids the need - * for a block which reduces nesting. For more complete comparison of - * reentrantLocks and synchronized see + * + *
  • + *
  • Synchronized blocks are unfair.
  • + *
  • The ability to check if the lock is being + * held.
  • + *
  • The ability to get the list of threads waiting on the lock.
  • + *
+ *

+ * The disadvantages of {@link java.util.concurrent.locks.ReentrantLock}s are: + *
+ *
    + *
  • Need to add import statement.
  • + *
  • Need to wrap lock acquisitions in a try/finally block. This makes it more + * ugly than the synchronized keyword.
  • + *
  • The synchronized keyword can be put in method definitions which avoids + * the need for a block which reduces nesting.
  • + *
+ *

+ * For more complete comparison of + * {@link java.util.concurrent.locks.ReentrantLock}s and {@code synchronized} + * see: * http://guruzon.com/1/concurrency/explicit-lock-locking/difference-between-synchronized-and-reentrantlock-in-java - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -42,8 +74,7 @@ public static void main(String[] args) throws Exception { public void run() { try { runner.firstThread(); - } catch (InterruptedException e) { - e.printStackTrace(); + } catch (InterruptedException ignored) { } } }); @@ -52,8 +83,7 @@ public void run() { public void run() { try { runner.secondThread(); - } catch (InterruptedException e) { - e.printStackTrace(); + } catch (InterruptedException ignored) { } } }); diff --git a/JavaMultiThreadingCodes/src/ReentrantLocks_10/Runner.java b/JavaMultiThreadingCodes/src/ReentrantLocks_10/Runner.java index 018f5d6..b97b4af 100644 --- a/JavaMultiThreadingCodes/src/ReentrantLocks_10/Runner.java +++ b/JavaMultiThreadingCodes/src/ReentrantLocks_10/Runner.java @@ -1,36 +1,52 @@ package ReentrantLocks_10; +import java.util.Scanner; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; /** - * Source:http://www.journaldev.com/2377/java-lock-example-and-concurrency-lock-vs-synchronized - * - * Lock: This is the base interface for Lock API. It provides all the features + * Source: + * http://www.journaldev.com/2377/java-lock-example-and-concurrency-lock-vs-synchronized + *

+ * {@link java.util.concurrent.locks.Lock}: + * This is the base interface for Lock API. It provides all the features * of synchronized keyword with additional ways to create different Conditions * for locking, providing timeout for thread to wait for lock. Some of the - * important methods are lock() to acquire the lock, unlock() to release the - * lock, tryLock() to wait for lock for a certain period of time, newCondition() + * important methods are {@link java.util.concurrent.locks.Lock#lock()} to + * acquire the lock, {@link java.util.concurrent.locks.Lock#unlock()} to release + * the lock, {@link java.util.concurrent.locks.Lock#tryLock()} to wait for lock + * for a certain period of time, + * {@link java.util.concurrent.locks.Lock#newCondition()} * to create the Condition etc. - * - * ReentrantLock: This is the most widely used implementation class of Lock + *

+ * {@link java.util.concurrent.locks.ReentrantLock}: + * This is the most widely used implementation class of Lock * interface. This class implements the Lock interface in similar way as * synchronized keyword. (see App.java for more) - * - * Condition: Condition objects are similar to Object wait-notify model with + *

+ * {@link java.util.concurrent.locks.Condition}: + * Condition objects are similar to Object wait-notify model with * additional feature to create different sets of wait. A Condition object is - * always created by Lock object. Some of the important methods are await() that - * is similar to wait() and signal(), signalAll() that is similar to notify() - * and notifyAll() methods. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * always created by Lock object. Some of the important methods are + * {@link java.util.concurrent.locks.Condition#await()} + * that is similar to {@link Object#wait()}. + * {@link java.util.concurrent.locks.Condition#signal()} and + * {@link java.util.concurrent.locks.Condition#signalAll()} + * that are similar to + * {@link Object#notify()} and {@link Object#notifyAll()} methods. + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ -import java.util.Scanner; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - public class Runner { private int count = 0; @@ -65,7 +81,8 @@ public void secondThread() throws InterruptedException { try { increment(); } finally { - lock.unlock();//should be written to unlock Thread whenever signal() is called + //should be written to unlock Thread whenever signal() is called + lock.unlock(); } } diff --git a/JavaMultiThreadingCodes/src/Semaphores_12/App.java b/JavaMultiThreadingCodes/src/Semaphores_12/App.java index dcccb55..154da74 100644 --- a/JavaMultiThreadingCodes/src/Semaphores_12/App.java +++ b/JavaMultiThreadingCodes/src/Semaphores_12/App.java @@ -5,34 +5,45 @@ import java.util.concurrent.TimeUnit; /** - * Semaphores are mainly used to limit the number of simultaneous threads that + * {@link java.util.concurrent.Semaphore}s + * are mainly used to limit the number of simultaneous threads that * can access a resources, but you can also use them to implement deadlock * recovery systems since a semaphore with one permit is basically a lock that - * you can unlock from other threads. - * + * can unlock from other threads. + *
* Source: + * * http://stackoverflow.com/questions/771347/what-is-mutex-and-semaphore-in-java-what-is-the-main-difference - * - * Mutex is basically mutual exclusion. Only one thread can acquire the resource - * at once. When one thread acquires the resource, no other thread is allowed to - * acquire the resource until the thread owning the resource releases. All - * threads waiting for acquiring resource would be blocked. - * + * + *

+ * Mutex (or a semaphore initialized to 1; meaning there's only one resource) + * is basically a mutual exclusion; Only one thread can acquire the resource + * at once, and all other threads trying to acquire the resource are blocked + * until the thread owning the resource releases. + *

* Semaphore is used to control the number of threads executing. There will be * fixed set of resources. The resource count will gets decremented every time * when a thread owns the same. When the semaphore count reaches 0 then no other * threads are allowed to acquire the resource. The threads get blocked till * other threads owning resource releases. - * + *

+ *

* In short, the main difference is how many threads are allowed to acquire the - * resource at once ? - * + * resource at once. + * TODO -- go a little more in depth explaining that * Mutex --its ONE. Semaphore -- its DEFINED_COUNT, ( as many as semaphore * count) - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -40,13 +51,15 @@ public class App { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newCachedThreadPool(); - for (int i = 0; i < 13; i++) { //200 hundred times will be calleds + + for (int i = 0; i < 20; i++) { //200 hundred times will be called executor.submit(new Runnable() { public void run() { - Connection.getInstance().connect(); + Connectionn.getInstance().connect(); } }); } + executor.shutdown(); executor.awaitTermination(1, TimeUnit.DAYS); } diff --git a/JavaMultiThreadingCodes/src/Semaphores_12/Connection.java b/JavaMultiThreadingCodes/src/Semaphores_12/Connection.java index f8f22c8..88836e2 100644 --- a/JavaMultiThreadingCodes/src/Semaphores_12/Connection.java +++ b/JavaMultiThreadingCodes/src/Semaphores_12/Connection.java @@ -4,19 +4,38 @@ /** * Semaphores - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ public class Connection { private static Connection instance = new Connection(); - //limit connections to 10 - //true means whichever the thread call the acquire first gets it first, - //in queue placed firts to obtain the permit. +/* + limit connections to 10 + true means whichever thread gets first in the waiting pool (queue) + waiting to acquire a resource, is first to obtain the permit. + + Note that I called it a pool! + The reason is when you say "Queue", you're saying that things are + scheduled to be FIFO (First In First Out) .. which is not always the case + here! + When you initialize the semaphore with Fairness, by setting its second + argument to true, it will treat the waiting threads like FIFO. + But, + it doesn't have to be that way if you don't set on the fairness. the JVM + may schedule the waiting threads in some other manner that it sees best + (See the Java specifications for that). +*/ private Semaphore sem = new Semaphore(10, true); private int connections = 0; @@ -29,16 +48,18 @@ public static Connection getInstance() { public void connect() { try { - sem.acquire(); // get permit decrease the sem value, if 0 wait for release - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - try { - //if doConnect throws and exception is still releases the permit - //so we use a separate method here to increase the connections count. + + // get permit decrease the sem value, if 0 wait for release + sem.acquire(); + + //if doConnect throws and exception is still releases the permit + //so we use a separate method here to increase the connections count doConnect(); + + } catch (InterruptedException ignored) { } finally { - sem.release();// release permit, increase the sem value and activate waiting thread + //release permit, increase the sem value and activate waiting thread + sem.release(); } } @@ -51,11 +72,9 @@ public void doConnect() { //do your job System.out.println("Working on connections " + Thread.currentThread().getName()); Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} //when exit doConnect method decrement number of connections - synchronized (this) {//atamoic + synchronized (this) {//atomic connections--; System.out.println("I'm done " + Thread.currentThread().getName() + " Connection is released , connection count: " + connections); } diff --git a/JavaMultiThreadingCodes/src/Semaphores_12/Connectionn.java b/JavaMultiThreadingCodes/src/Semaphores_12/Connectionn.java new file mode 100644 index 0000000..0171cc7 --- /dev/null +++ b/JavaMultiThreadingCodes/src/Semaphores_12/Connectionn.java @@ -0,0 +1,73 @@ +package Semaphores_12; + +import java.util.concurrent.Semaphore; + +/** + * Semaphores + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
+ * also freely available at + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * + * @author Z.B. Celik + */ +public class Connectionn { + + private static Connectionn instance = new Connectionn(); + /* + limit connections to 10 + true means whichever thread gets first in the waiting pool (queue) + waiting to acquire a resource, is first to obtain the permit. + + Note that I called it a pool! + The reason is when you say "Queue", you're saying that things are + scheduled to be FIFO (First In First Out) .. which is not always the case + here! + When you initialize the semaphore with Fairness, by setting its second + argument to true, it will treat the waiting threads like FIFO. + But, + it doesn't have to be that way if you don't set on the fairness. the JVM + may schedule the waiting threads in some other manner that it sees best + (See the Java specifications for that). + */ + private Semaphore sem = new Semaphore(10, true); + + private Connectionn() { + } + + public static Connectionn getInstance() { + return instance; + } + + public void connect() { + try { + + // get permit decrease the sem value, if 0 wait for release + sem.acquire(); + + System.out.printf("%s:: Current connections (max 10 allowed): %d\n", + Thread.currentThread().getName(), + sem.availablePermits()); + + //do your job + System.out.printf("%s:: WORKING...\n", + Thread.currentThread().getName()); + Thread.sleep(2000); + + System.out.printf("%s:: Connection released. Permits Left = %d\n", + Thread.currentThread().getName(), + sem.availablePermits()); + + } catch (InterruptedException ignored) { + } finally { + //release permit, increase the sem value and activate waiting thread + sem.release(); + } + } +} diff --git a/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationAnonymous.java b/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationAnonymous.java index cd99566..8e11f90 100644 --- a/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationAnonymous.java +++ b/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationAnonymous.java @@ -2,10 +2,16 @@ /** * Starting threads using the Thread constructor with anonymous classes - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -20,10 +26,7 @@ public void run() { try { Thread.sleep(100); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } } }); diff --git a/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationExtends.java b/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationExtends.java index fbbac2e..68d346a 100644 --- a/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationExtends.java +++ b/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationExtends.java @@ -2,10 +2,16 @@ /** * Starting Threads with extends - * + *

* Codes with minor comments are from - * http://www.caveofprogramming.com/youtube/ also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * http://www.caveofprogramming.com/youtube/ + * + *
+ * also freely available at + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ diff --git a/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationRunnable.java b/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationRunnable.java index 5d5237a..a7561e3 100644 --- a/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationRunnable.java +++ b/JavaMultiThreadingCodes/src/StartingThreads_1/ApplicationRunnable.java @@ -2,10 +2,16 @@ /** * Starting Threads using Runnable Interface - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ diff --git a/JavaMultiThreadingCodes/src/ThreadPools_5/App.java b/JavaMultiThreadingCodes/src/ThreadPools_5/App.java index c94b1c6..3cc0c33 100644 --- a/JavaMultiThreadingCodes/src/ThreadPools_5/App.java +++ b/JavaMultiThreadingCodes/src/ThreadPools_5/App.java @@ -2,10 +2,16 @@ /** * ThreadPool ("number of workers in a factory") - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -25,7 +31,7 @@ public void run() { System.out.println("Starting: " + id); try { Thread.sleep(5000); - } catch (InterruptedException e) { + } catch (InterruptedException ignored) { } System.out.println("Completed: " + id); } @@ -45,7 +51,7 @@ public static void main(String[] args) { System.out.println("All tasks submitted."); try { executor.awaitTermination(1, TimeUnit.DAYS); - } catch (InterruptedException e) { + } catch (InterruptedException ignored) { } System.out.println("All tasks completed."); } diff --git a/JavaMultiThreadingCodes/src/ThreadPools_5/WorkerThreadPool.java b/JavaMultiThreadingCodes/src/ThreadPools_5/WorkerThreadPool.java index 1535f50..6251a4f 100644 --- a/JavaMultiThreadingCodes/src/ThreadPools_5/WorkerThreadPool.java +++ b/JavaMultiThreadingCodes/src/ThreadPools_5/WorkerThreadPool.java @@ -8,19 +8,25 @@ import java.util.concurrent.TimeUnit; /** - * This is the implementation of LockObjects_4.Worker with threadPool - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * This is the implementation of {@link LockObjects_4.Worker} with threadPool + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ class Worker implements Runnable { private Random random = new Random(); - private Object lock1 = new Object(); - private Object lock2 = new Object(); + private final Object lock1 = new Object(); + private final Object lock2 = new Object(); public List list1 = new ArrayList<>(); public List list2 = new ArrayList<>(); @@ -64,21 +70,21 @@ public void stageTwo() { public class WorkerThreadPool { public static void main(String[] args) { - ExecutorService executer = Executors.newFixedThreadPool(2);//two threads, try setting by 1 to observe time + ExecutorService executor = Executors.newFixedThreadPool(2);//two threads, try setting by 1 to observe time System.out.println("Starting ..."); long start = System.currentTimeMillis(); Worker worker = new Worker(); for (int i = 0; i < 2; i++) {//worker.run is called 2 (threads started) times by two threads - executer.submit(worker); + executor.submit(worker); } - executer.shutdown(); //prevents new tasks from being accepted by the ExecutorService + executor.shutdown(); //prevents new tasks from being accepted by the ExecutorService try { - executer.awaitTermination(1, TimeUnit.DAYS); - // How long should I wait for termination If I donot know exactly when threads are done with the tasks ? + executor.awaitTermination(1, TimeUnit.DAYS); + // How long should I wait for termination If I do not know exactly when threads are done with the tasks ? // Source:http://stackoverflow.com/questions/1250643/how-to-wait-for-all-threads-to-finish-using-executorservice - // For a perpetually running batch kind of thing u need to submit jobs and wait for them to - // finish before jumping ahead. - // In Such a case a latch or a barrier makes more sense than a shutdown (see CountDownLatch_6.App). + // For a perpetually running batch kind of thing u need to submit jobs and wait for them to + // finish before jumping ahead. + // In Such a case a latch or a barrier makes more sense than a shutdown (see CountDownLatch_6.App). } catch (InterruptedException ex) { System.out.println(ex.getMessage()); } diff --git a/JavaMultiThreadingCodes/src/VolatileKeyword_2/App.java b/JavaMultiThreadingCodes/src/VolatileKeyword_2/App.java index cc9ba8e..027ac29 100644 --- a/JavaMultiThreadingCodes/src/VolatileKeyword_2/App.java +++ b/JavaMultiThreadingCodes/src/VolatileKeyword_2/App.java @@ -1,12 +1,18 @@ package VolatileKeyword_2; /** - * Volatile Keyword, “… the volatile modifier guarantees that any thread that - * reads a field will see the most recently written value.” - Josh Bloch - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * Volatile Keyword, “… the volatile modifier guarantees that any thread that + * reads a field will see the most recently written value.” - Josh Bloch + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ diff --git a/JavaMultiThreadingCodes/src/WaitAndNotify_8/App.java b/JavaMultiThreadingCodes/src/WaitAndNotify_8/App.java index 4cc108e..c6e2b07 100644 --- a/JavaMultiThreadingCodes/src/WaitAndNotify_8/App.java +++ b/JavaMultiThreadingCodes/src/WaitAndNotify_8/App.java @@ -1,14 +1,21 @@ package WaitAndNotify_8; /** - * wait and notify in Java; low-level multithreading methods of the Object class + * {@link Object#wait()} and {@link Object#notify()} in Java; low-level + * multi-threading methods of the {@link java.lang.Object} class * that allow you to have one or more threads sleeping, only to be woken up by * other threads at the right moment. Extremely useful for avoiding those * processor-consuming "polling loops". - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ @@ -21,9 +28,7 @@ public static void main(String[] args) throws InterruptedException { public void run() { try { processor.produce(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); @@ -32,11 +37,10 @@ public void run() { public void run() { try { processor.consume(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); + t1.start(); t2.start(); t1.join(); diff --git a/JavaMultiThreadingCodes/src/WaitAndNotify_8/BlockingQueueApp.java b/JavaMultiThreadingCodes/src/WaitAndNotify_8/BlockingQueueApp.java index 23c61d8..99f76ca 100644 --- a/JavaMultiThreadingCodes/src/WaitAndNotify_8/BlockingQueueApp.java +++ b/JavaMultiThreadingCodes/src/WaitAndNotify_8/BlockingQueueApp.java @@ -9,42 +9,49 @@ /** * Source: - * http://stackoverflow.com/questions/2536692/a-simple-scenario-using-wait-and-notify-in-java - * Firstly, you need to ensure that any calls to wait() or notify() are within a - * synchronized region of code (with the wait() and notify() calls being - * synchronized on the "same" object). The reason for this (other than the - * standard thread safety concerns) is due to something known as a missed - * signal. - * - * An example of this, is that a thread may call put() when the queue happens to - * be full, it then checks the condition, sees that the queue is full, however + * http://stackoverflow.com/questions/2536692/a-simple-scenario-using-wait-and-notify-in-java + *

+ * Firstly, you need to ensure that any calls to {@code wait() or notify()} are + * within a synchronized region of code (with the {@code wait() or notify()} + * calls being synchronized on the "same" object). + * The reason for this (other than the standard thread safety concerns) is + * due to something known as a missed signal. + *

+ * An example of this, is that a thread may call {@link WaitAndNotify_8.BlockingQueue#put} + * when the queue happens to be full, it then checks the condition, sees that + * the queue is full, however * before it can block another thread is scheduled. This second thread then - * take()'s an element from the queue, and notifies the waiting threads that the + * {@link WaitAndNotify_8.BlockingQueue#take()}'s an element from the queue, + * and notifies the waiting threads that the * queue is no longer full. Because the first thread has already checked the - * condition however, it will simply call wait() after being re-scheduled, even - * though it could make progress. - * + * condition. However, it will simply call {@code wait()} after being + * re-scheduled, even though it could make progress. + *
* By synchronizing on a shared object, you can ensure that this problem does - * not occur, as the second thread's take() call will not be able to make - * progress until the first thread has actually blocked. - * + * not occur,as the second thread's {@link WaitAndNotify_8.BlockingQueue#take()} + * call will not be able to make progress until the first thread has actually + * blocked. + *
* You must hold the lock (synchronized) before invoking wait/notify. Threads * also have to acquire lock before waking. - * - * More:In order to wait on an object, we must be synchronized on that object. + *

+ * More: In order to wait on an object, we must be synchronized on that object. + *
* But our thread will automatically release the lock temporarily while waiting. - * Calling wait() means that our thread will be suspended until it is + * Calling {@code wait()} means that our thread will be suspended until it is * "notified". Our thread will be "notified", and thus woken up, when another - * thread calls notify() on the object that we're waiting on (in this case, the - * connection list). When our thread wakes up, it automatically regains the + * thread calls {@code notify()} on the object that we're waiting on (in this + * case, the connection list). + * When our thread wakes up, it automatically regains the * lock. We can now check again that the list is not empty, and if it isn't, * safely take out the first connection. This checking and removing will be * atomic because we have the lock on the list. * - * @author Z.B. Celik * + * @author Z.B. Celik */ -//For the other version of the implementation please check LowLevelProducerConsumer_9.App +//For the other version of the implementation please check +// LowLevelProducerConsumer_9.App class BlockingQueue { private Queue queue = new LinkedList<>(); @@ -63,12 +70,12 @@ public void put(T element) throws InterruptedException { try { while (queue.size() == capacity) { System.out.println("queue is full cannot put"); - notFull.await();//releases lock + notFull.await(); //releases lock } queue.add(element); System.out.println("Added to the queue " + element); - notEmpty.signal();//call waiting thread on same object + notEmpty.signal(); //calls waiting thread on the same object } finally { lock.unlock(); } @@ -79,12 +86,12 @@ public T take() throws InterruptedException { try { while (queue.isEmpty()) { System.out.println("queue is empty, cannot take"); - notEmpty.await();//releases lock + notEmpty.await(); //releases lock } T item = queue.remove(); System.out.println("Removed to the queue " + item); - notFull.signal();//call waiting thread on same object + notFull.signal(); //calls waiting thread on same object return item; } finally { lock.unlock(); @@ -92,6 +99,7 @@ public T take() throws InterruptedException { } } +@SuppressWarnings("InfiniteLoopStatement") public class BlockingQueueApp { public static void main(String[] args) throws InterruptedException { @@ -103,9 +111,7 @@ public void run() { while (true) { blockingQueue.put(random.nextInt(10)); } - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); @@ -120,9 +126,7 @@ public void run() { while (true) { blockingQueue.take(); } - } catch (InterruptedException e) { - e.printStackTrace(); - } + } catch (InterruptedException ignored) {} } }); t1.start(); diff --git a/JavaMultiThreadingCodes/src/WaitAndNotify_8/Processor.java b/JavaMultiThreadingCodes/src/WaitAndNotify_8/Processor.java index bf4ca1a..21171c1 100644 --- a/JavaMultiThreadingCodes/src/WaitAndNotify_8/Processor.java +++ b/JavaMultiThreadingCodes/src/WaitAndNotify_8/Processor.java @@ -3,31 +3,48 @@ import java.util.Scanner; /** - * Some background knowledge - * Source:http://www.programcreek.com/2009/02/notify-and-wait-example/ - * synchronized keyword is used for exclusive accessing. To make a method - * synchronized, simply add the synchronized keyword to its declaration. Then no - * two invocations of synchronized methods on the same object can interleave - * with each other. Synchronized statements must specify the object that - * provides the intrinsic lock. When synchronized(this) is used, you have to - * avoid to synchronizing invocations of other objects' methods. wait() tells + * Some background knowledge
+ * Source: http://www.programcreek.com/2009/02/notify-and-wait-example/ + *

+ * {@code synchronized} keyword is used for exclusive accessing. To make a + * method {@code synchronized}, simply add the {@code synchronized} keyword to its + * declaration. + * Then no two invocations of synchronized methods on the same object can + * interleave with each other. + *
+ * Synchronized statements must specify the object that + * provides the intrinsic lock. When {@code synchronized(this)} is used, you + * have to avoid to synchronizing invocations of other objects' methods. + *
+ * {@link Object#wait()} tells * the calling thread to give up the lock and go to sleep (not polling) until - * some other thread enters the same lock and calls notify(). notify() wakes up - * the first thread that called wait() on the same object. - * - * Codes with minor comments are from http://www.caveofprogramming.com/youtube/ + * some other thread enters the same lock and calls {@link Object#notify()}. + *
+ * {@link Object#notify()} wakes up the first thread that called wait() on + * the same object. + *

+ * Codes with minor comments are from + * + * http://www.caveofprogramming.com/youtube/ + * + *
* also freely available at - * https://www.udemy.com/java-multithreading/?couponCode=FREE + * + * https://www.udemy.com/java-multithreading/?couponCode=FREE + * * * @author Z.B. Celik */ public class Processor { - /** + /* * public synchronized void getSomething(){ this.hello = "hello World"; } * public void getSomething(){ synchronized(this){ this.hello = "hello - * World"; } , two code blocks by specification, functionally identical. + * World"; } } + * two code blocks by specification, functionally identical. */ + + public void produce() throws InterruptedException { synchronized (this) { System.out.println("Producer thread running ...."); @@ -45,6 +62,7 @@ public void consume() throws InterruptedException { System.out.println("Return key pressed."); notify(); Thread.sleep(5000); + System.out.println("Consumption done."); } } } diff --git a/README.md b/README.md index 873dc08..6d91e04 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,28 @@ +# Java Multithreading +This repository contains all the codes required for the ultimate John Purcell's [Java-MultiThreading](https://caveofprogramming.teachable.com/p/java-multithreading) course. -Java Multithreading -============================================================= -This repository will contain all the codes for the ultimate Java multithreading course by John Purcell +We recommend the codes for those interested in understanding the multithreading. The code is written in Java and the topics are numbered by following the lecture content. -See the [Video Tutorials](https://www.udemy.com/java-multithreading/) -for more information. -Contributor ----------- -[Z.B. Celik] (http://www.linkedin.com/in/berkaycelik) +## Java Multithreading Topics: +- 1- Java Multithreading: Starting Threads +- 2- Java Multithreading: Volatile – Basic Thread Communication +- 3- Java Multithreading: Synchronized +- 4- Java Multithreading: Lock Objects +- 5- Java Multithreading: Thread Pools +- 6- Java Multithreading: Countdown Latches +- 7- Java Multithreading: Producer-Consumer +- 8- Java Multithreading: Wait and Notify +- 9- Java Multithreading: Low-Level Producer-Consumer +- 10- Java Multithreading: Re-entrant Locks +- 11- Java Multithreading: Deadlock +- 12- Java Multithreading: Semaphores +- 13- Java Multithreading: Callable and Future +- 14- Java Multithreading: Interrupting Threads -Java Multithreading Topics: -------------- -Codes with minor comments are from http://www.caveofprogramming.com/youtube/ also freely available at https://www.udemy.com/java-multithreading/?couponCode=FREE +## Contributors +[Z. Berkay Celik](https://twitter.com/ZBerkayCelik) -- 1- Java Multithreading: Starting Threads -- 2- Java Multithreading: Volatile – Basic Thread Communication -- 3- Java Multithreading: Synchronized -- 4- Java Multithreading: Lock Objects -- 5- Java Multithreading: Thread Pools -- 6- Java Multithreading: Countdown Latches -- 7- Java Multithreading: Producer-Consumer -- 8- Java Multithreading: Wait and Notify -- 9- Java Multithreading: Low-Level Producer-Consumer -- 10- Java Multithreading: Re-entrant Locks -- 11- Java Multithreading: Deadlock -- 12- Java Multithreading: Semaphores -- 13- Java Multithreading: Callable and Future -- 14- Java Multithreading: Interrupting Threads +[@IOAyman](https://twitter.com/IOAyman)