diff --git a/03concurrency/0301/pom.xml b/03concurrency/0301/pom.xml new file mode 100644 index 00000000..55691a2d --- /dev/null +++ b/03concurrency/0301/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + java0.03concurrency + 0301 + 1.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + \ No newline at end of file diff --git a/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java b/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java new file mode 100644 index 00000000..8d985a55 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/DaemonThread.java @@ -0,0 +1,25 @@ +package java0.conc0301; + +public class DaemonThread { + + public static void main(String[] args) { + Runnable task = new Runnable() { + @Override + public void run() { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Thread t = Thread.currentThread(); + System.out.println("当前线程:" + t.getName()); + } + }; + Thread thread = new Thread(task); + thread.setName("test-thread-1"); + thread.setDaemon(true); + thread.start(); + } + + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/Runner1.java b/03concurrency/0301/src/main/java/java0/conc0301/Runner1.java new file mode 100644 index 00000000..1e6657bf --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/Runner1.java @@ -0,0 +1,11 @@ +package java0.conc0301; + +public class Runner1 implements Runnable { + + @Override + public void run() { + for (int i = 0; i < 100; i++) { + System.out.println("进入Runner1运行状态——————————" + i); + } + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/Runner2.java b/03concurrency/0301/src/main/java/java0/conc0301/Runner2.java new file mode 100644 index 00000000..c9ff3b96 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/Runner2.java @@ -0,0 +1,21 @@ +package java0.conc0301; + +public class Runner2 implements Runnable { + + @Override + public void run() { + for (int i = 0; i < 100; i++) { + System.out.println("进入Runner2运行状态——————————" + i); + } + + boolean result = Thread.currentThread().isInterrupted(); + + boolean result1 = Thread.interrupted(); // 重置状态 + + boolean result3 = Thread.currentThread().isInterrupted(); + + System.out.println("Runner2.run result ===>" + result); + System.out.println("Runner2.run result1 ===>" + result1); + System.out.println("Runner2.run result3 ===>" + result3); + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java b/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java new file mode 100644 index 00000000..4526412e --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/RunnerMain.java @@ -0,0 +1,25 @@ + +package java0.conc0301; + +public class RunnerMain { + + public static void main(String[] args) { + + Runner1 runner1 = new Runner1(); + Thread thread1 = new Thread(runner1); + + Runner2 runner2 = new Runner2(); + Thread thread2 = new Thread(runner2); + + thread1.start(); + thread2.start(); + + thread2.interrupt(); + + System.out.println(Thread.activeCount()); + +// Thread.currentThread().getThreadGroup().list(); +// System.out.println(Thread.currentThread().getThreadGroup().getParent().activeGroupCount()); +// Thread.currentThread().getThreadGroup().getParent().list(); + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/ThreadA.java b/03concurrency/0301/src/main/java/java0/conc0301/ThreadA.java new file mode 100644 index 00000000..50e548f6 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/ThreadA.java @@ -0,0 +1,14 @@ +package java0.conc0301; + +public class ThreadA extends Thread { + + public void run() { + super.run(); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("这是线程A"); + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/ThreadB.java b/03concurrency/0301/src/main/java/java0/conc0301/ThreadB.java new file mode 100644 index 00000000..0b0ad326 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/ThreadB.java @@ -0,0 +1,26 @@ +package java0.conc0301; + +public class ThreadB implements Runnable { + + @Override + public void run() { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("这是线程B"); + + Thread currentThread = Thread.currentThread(); + String currentThreadName = currentThread.getName(); + + System.out.println("这是线程的名称:" + currentThreadName); + System.out.println("返回当前线程" + currentThreadName + "的线程组中活动线程的数量:" + Thread.activeCount()); + System.out.println("返回该线程" + currentThreadName + "的标识符:" + currentThread.getId()); + System.out.println("返回该线程" + currentThreadName + "的优先级:" + currentThread.getPriority()); + System.out.println("返回该线程" + currentThreadName + "的状态:" + currentThread.getState()); + System.out.println("返回该线程" + currentThreadName + "所属的线程组:" + currentThread.getThreadGroup()); + System.out.println("测试该线程" + currentThreadName + "是否处于活跃状态:" + currentThread.isAlive()); + System.out.println("测试该线程" + currentThreadName + "是否为守护线程:" + currentThread.isDaemon()); + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/ThreadC.java b/03concurrency/0301/src/main/java/java0/conc0301/ThreadC.java new file mode 100644 index 00000000..cc01e3b8 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/ThreadC.java @@ -0,0 +1,16 @@ +package java0.conc0301; + +import java.util.concurrent.Callable; + +public class ThreadC implements Callable { + + @Override + public String call() throws Exception { + Thread.sleep(500); + System.out.println("这是线程C"); + return "线程C"; + } + + + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain.java b/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain.java new file mode 100644 index 00000000..3a12ddb7 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain.java @@ -0,0 +1,32 @@ +package java0.conc0301; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; + +public class ThreadMain { + + public static void main(String[] args) { + + ThreadA threadA = new ThreadA(); + threadA.start(); + System.out.println("这是主线程:"); + + ThreadB threadB = new ThreadB(); + new Thread(threadB).start(); + System.out.println("这是主线程:"); + + ThreadC threadC = new ThreadC(); + FutureTask futureTask = new FutureTask<>(threadC); + new Thread(futureTask).start(); + System.out.println("这是主线程:begin!"); + try { + System.out.println("得到的返回结果是:" + futureTask.get()); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + + } + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain2.java b/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain2.java new file mode 100644 index 00000000..b365b40c --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/ThreadMain2.java @@ -0,0 +1,39 @@ +package java0.conc0301; + +public class ThreadMain2 { + + public static void main(String[] args) { + + ThreadB threadB = new ThreadB(); + for (int i = 0; i < 5; i++) { + new Thread(threadB, "线程名称:(" + i + ")").start(); + } + + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + //返回对当前正在执行的线程对象的引用 + Thread threadMain = Thread.currentThread(); + System.out.println("这是主线程:"); + System.out.println("返回当前线程组中活动线程的数目:" + Thread.activeCount()); + System.out.println("主线程的名称:" + threadMain.getName()); + System.out.println("返回该线程的标识符:" + threadMain.getId()); + System.out.println("返回线程的优先级:" + threadMain.getPriority()); + System.out.println("返回线程的状态:" + threadMain.getState()); + System.out.println("返回该线程所属的线程组:" + threadMain.getThreadGroup()); + System.out.println("测试线程是否为守护线程:" + threadMain.isDaemon()); + + +// try { +// Thread.sleep(10000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + + } + + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java b/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java new file mode 100644 index 00000000..13fadb19 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/op/Join.java @@ -0,0 +1,50 @@ +package java0.conc0301.op; + +public class Join { + + public static void main(String[] args) { + Object oo = new Object(); + + MyThread thread1 = new MyThread("thread1 -- "); + thread1.setOo(oo); + thread1.start(); + + synchronized (oo) { + for (int i = 0; i < 100; i++) { + if (i == 20) { + try { + thread1.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println(Thread.currentThread().getName() + " -- " + i); + } + } + } + +} + +class MyThread extends Thread { + + private String name; + private Object oo; + + public void setOo(Object oo) { + this.oo = oo; + } + + public MyThread(String name) { + this.name = name; + } + + @Override + public void run() { + synchronized (oo) { + for (int i = 0; i < 100; i++) { + System.out.println(name + i); + } + } + } + +} \ No newline at end of file diff --git a/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java b/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java new file mode 100644 index 00000000..bd3e1e4e --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/op/WaitAndNotify.java @@ -0,0 +1,73 @@ +package java0.conc0301.op; + +public class WaitAndNotify { + public static void main(String[] args) { + MethodClass methodClass = new MethodClass(); + Thread t1 = new Thread(() -> { + try { + methodClass.product(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }, "t1"); + Thread t2 = new Thread(() -> { + try { + methodClass.customer(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }, "t2"); + Thread t3 = new Thread(() -> { + try { + methodClass.customer(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }, "t3"); + t1.start(); + t2.start(); + t3.start(); + + } +} + +class MethodClass { + // 定义生产最大量 + private final int MAX_COUNT = 20; + + int productCount = 0; + + public synchronized void product() throws InterruptedException { + while (true) { + System.out.println(Thread.currentThread().getName() + ":::run:::" + productCount); + Thread.sleep(10); + if (productCount >= MAX_COUNT) { + System.out.println("货舱已满,,.不必再生产"); + + wait(); + }else { + productCount++; + } + + notifyAll(); + } + } + + public synchronized void customer() throws InterruptedException { + while (true) { + System.out.println(Thread.currentThread().getName() + ":::run:::" + productCount); + Thread.sleep(10); + if (productCount <= 0) { + System.out.println("货舱已无货...无法消费"); + wait(); + }else { + productCount--; + } + + notifyAll(); + } + } +} \ No newline at end of file diff --git a/03concurrency/0301/src/main/java/java0/conc0301/sync/Counter.java b/03concurrency/0301/src/main/java/java0/conc0301/sync/Counter.java new file mode 100644 index 00000000..a066caf8 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/sync/Counter.java @@ -0,0 +1,44 @@ +package java0.conc0301.sync; + +public class Counter { + private int sum = 0; + public void incr() { + sum++; + } + public int getSum() { + return sum; + } + + public static void main(String[] args) throws InterruptedException { + int loop = 10000; + + // test single thread + Counter counter = new Counter(); + for (int i = 0; i < loop; i++) { + counter.incr(); + } + System.out.println("single thread: " + counter.getSum()); + + // test multiple threads + final Counter counter2 = new Counter(); + Thread t1 = new Thread(() -> { + for (int i = 0; i < loop / 2; i++) { + counter2.incr(); + } + }); + Thread t2 = new Thread(() -> { + for (int i = 0; i < loop / 2; i++) { + counter2.incr(); + } + }); + t1.start(); + t2.start(); + //Thread.sleep(300); + while (Thread.activeCount()>2){//当前线程的线程组中的数量>2 + Thread.yield(); + } + System.out.println("multiple threads: " + counter2.getSum()); + + + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread1.java b/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread1.java new file mode 100644 index 00000000..4dc7513f --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread1.java @@ -0,0 +1,22 @@ + +package java0.conc0301.sync; + +public class Thread1 implements Runnable { + + @Override + public void run() { + synchronized (this) { + for (int i = 0; i < 10; i++) { + System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); + } + } + } + + public static void main(String[] args) { + Thread1 t1 = new Thread1(); + Thread ta = new Thread(t1, "A"); + Thread tb = new Thread(t1, "B"); + ta.start(); + tb.start(); + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread2.java b/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread2.java new file mode 100644 index 00000000..d0f0638b --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread2.java @@ -0,0 +1,46 @@ + +package java0.conc0301.sync; + +public class Thread2 { + + public void m4t1() { + synchronized (this) { + int i = 5; + while (i-- > 0) { + System.out.println(Thread.currentThread().getName() + " : " + i); + try { + Thread.sleep(500); + } catch (InterruptedException ie) { + } + } + } + } + + public synchronized void m4t2() { + int i = 5; + while (i-- > 0) { + System.out.println(Thread.currentThread().getName() + " : " + i); + try { + Thread.sleep(500); + } catch (InterruptedException ie) { + } + } + } + + public static void main(String[] args) { + final Thread2 myt2 = new Thread2(); + Thread t1 = new Thread(new Runnable() { + public void run() { + myt2.m4t1(); + } + }, "t1"); + Thread t2 = new Thread(new Runnable() { + public void run() { + myt2.m4t2(); + } + }, "t2"); + t2.start(); + t1.start(); + } + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread3.java b/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread3.java new file mode 100644 index 00000000..f9d5d742 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/sync/Thread3.java @@ -0,0 +1,55 @@ + +package java0.conc0301.sync; + +public class Thread3 { + class Inner { + private void m4t1() { + int i = 5; + while (i-- > 0) { + System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i); + try { + Thread.sleep(500); + } catch (InterruptedException ie) { + } + } + } + + private void m4t2() { + int i = 5; + while (i-- > 0) { + System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i); + try { + Thread.sleep(500); + } catch (InterruptedException ie) { + } + } + } + } + + private void m4t1(Inner inner) { + synchronized (inner) { //使用对象锁 + inner.m4t1(); + } + } + + private void m4t2(Inner inner) { + inner.m4t2(); + } + + public static void main(String[] args) { + final Thread3 myt3 = new Thread3(); + final Inner inner = myt3.new Inner(); + Thread t1 = new Thread(new Runnable() { + public void run() { + myt3.m4t1(inner); + } + }, "t1"); + Thread t2 = new Thread(new Runnable() { + public void run() { + myt3.m4t2(inner); + } + }, "t2"); + t1.start(); + t2.start(); + } +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/ExecutorServiceDemo.java b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/ExecutorServiceDemo.java new file mode 100644 index 00000000..cc777c9a --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/ExecutorServiceDemo.java @@ -0,0 +1,26 @@ + +package java0.conc0301.threadpool; + +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +public class ExecutorServiceDemo { + + public static void main(String[] args) { + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(16); + try { + String str = executorService.submit(new Callable() { + @Override + public String call() throws Exception { + return "I am a task, which submited by the so called laoda, and run by those anonymous workers"; + } + }).get(); + + System.out.println("str=" + str); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewCachedThreadPoolDemo.java b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewCachedThreadPoolDemo.java new file mode 100644 index 00000000..69cb8a6e --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewCachedThreadPoolDemo.java @@ -0,0 +1,35 @@ + +package java0.conc0301.threadpool; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class NewCachedThreadPoolDemo { + + public static void main(String[] args) { + + ExecutorService executorService = Executors.newCachedThreadPool(); + + for (int i = 0; i < 10000; i++) { + final int no = i; + Runnable runnable = new Runnable() { + @Override + public void run() { + try { + System.out.println("start:" + no); + Thread.sleep(1000L); + System.out.println("end:" + no); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + executorService.execute(runnable); + } + executorService.shutdown(); + System.out.println("Main Thread End!"); + + + } + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewFixedThreadExecutorDemo.java b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewFixedThreadExecutorDemo.java new file mode 100644 index 00000000..19bc39bc --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewFixedThreadExecutorDemo.java @@ -0,0 +1,27 @@ + +package java0.conc0301.threadpool; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class NewFixedThreadExecutorDemo { + + public static void main(String[] args) { + ExecutorService executorService = Executors.newFixedThreadPool(16); + for (int i = 0; i < 100; i++) { + final int no = i; + executorService.execute(() -> { + try { + System.out.println("start:" + no); + Thread.sleep(1000L); + System.out.println("end:" + no); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + } + executorService.shutdown(); + System.out.println("Main Thread End!"); + } + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewScheduledThreadExecutorDemo.java b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewScheduledThreadExecutorDemo.java new file mode 100644 index 00000000..9186d21b --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewScheduledThreadExecutorDemo.java @@ -0,0 +1,37 @@ + +package java0.conc0301.threadpool; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class NewScheduledThreadExecutorDemo { + + public static void main(String[] args) { + + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(16); + + for (int i = 0; i < 100; i++) { + final int no = i; + Runnable runnable = new Runnable() { + @Override + public void run() { + try { + System.out.println("start:" + no); + Thread.sleep(1000L); + System.out.println("end:" + no); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + // 10s后执行 + executorService.schedule(runnable, 10, TimeUnit.SECONDS); + } + executorService.shutdown(); + System.out.println("Main Thread End!"); + + + } + +} diff --git a/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewSingleThreadExecutorDemo.java b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewSingleThreadExecutorDemo.java new file mode 100644 index 00000000..e328ca83 --- /dev/null +++ b/03concurrency/0301/src/main/java/java0/conc0301/threadpool/NewSingleThreadExecutorDemo.java @@ -0,0 +1,29 @@ + +package java0.conc0301.threadpool; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class NewSingleThreadExecutorDemo { + + public static void main(String[] args) { + + ExecutorService executorService = Executors.newSingleThreadExecutor(); + + for (int i = 0; i < 10; i++) { + final int no = i; + executorService.execute(() -> { + System.out.println("start:" + no); + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("end:" + no); + }); + } + executorService.shutdown(); + System.out.println("Main Thread End!"); + } + +}