diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..43aca2b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: java + +jdk: + - oraclejdk8 + +before_install: + - export TZ='Asia/Shanghai' diff --git a/README.md b/README.md index 383822d..7f11cff 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,36 @@ -[![](https://img.shields.io/badge/开源社区-junicorn-green.svg)](https://github.com/junicorn) -[![](https://img.shields.io/badge/license-MIT-000000.svg)](LICENSE) +# Java 并发编程实战 -# concurrent-programming-for-java +该电子书是整理 Java 并发编程的一些笔记,希望可以带动更多开发者进入 Java 并发的世界。 +这个项目分为 [源码](https://github.com/junicorn/concurrent-programming-for-java) 和 [在线阅读](https://www.gitbook.com/book/dr-lester/concurrent-programming-for-java/details), +源码使用 Maven 构建,涉及多线程基础、多线程设计模式、JDK并发包详细介绍、并发编程深入等知识。 +**拥有初学者的心态是件了不起的事情** -## 初衷(Original Intention) +[![Build Status](https://img.shields.io/travis/junicorn/concurrent-programming-for-java.svg)](https://travis-ci.org/junicorn/concurrent-programming-for-java) +[![junicorn](https://img.shields.io/badge/Java开源社区-junicorn-green.svg)](https://github.com/junicorn) +[![License](https://img.shields.io/badge/license-MIT-4EB1BA.svg)](LICENSE) -- 整理下自己所学 -- 带动更多的人进入 Java 并发的世界 -- GitHub 项目地址,欢迎 `Fork`、`Star`: -- GitBook 讲解,采用 Maven 构建,分模块学习,涉及多线程基础、多线程设计模式、JDK并发包详细介绍、并发编程深入等知识。 -- **拥有初学者的心态是件了不起的事情** +## 阅读指南 -## 目录(Contents) - -- 1.多线程基础 +### 1. 多线程基础 +  1.1 创建并启动线程  1.2 线程的生命周期  1.3 start方法源码剖析  1.4 Runnable接口详解 +  1.5 Thread Api详解 +  1.6 Daemon线程的创建以及使用场景分析 +  1.7 线程ID以及优先级 +  1.8 Thread的join方法详解,结合一个典型案例 +  1.9 Thread中断Interrupt方法详解 -## 联系(Contact) +## 联系作者 - Email:googllwebmaster@gmail.com(常用) or godql@godql.com(备用) - Blog: - QQ 群交流:655204361 - 欢迎捐赠 ^_^: -## Github 常用按钮说明 +## Github 按钮说明 - Watch:关注该项目,作者有更新的时候,会在你的 Github 主页有通知消息。 - Star:收藏该项目,在你的头像上有一个“Your stars”链接,可以看到你的收藏列表。 diff --git a/concurrent-package/pom.xml b/concurrent-package/pom.xml index 5a72936..04e8179 100644 --- a/concurrent-package/pom.xml +++ b/concurrent-package/pom.xml @@ -6,7 +6,7 @@ org.lester - parent + concurrent-programming-for-java 1.0-SNAPSHOT ../pom.xml diff --git a/in-depth-concurrent-programming/pom.xml b/in-depth-concurrent-programming/pom.xml index a5cfbff..980d952 100644 --- a/in-depth-concurrent-programming/pom.xml +++ b/in-depth-concurrent-programming/pom.xml @@ -6,7 +6,7 @@ org.lester - parent + concurrent-programming-for-java 1.0-SNAPSHOT ../pom.xml diff --git a/pom.xml b/pom.xml index 19be6c3..f13f037 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.lester - parent + concurrent-programming-for-java 1.0-SNAPSHOT pom @@ -22,6 +22,18 @@ 4.12 + + + + + junit + junit + ${junit.version} + + + + + @@ -35,16 +47,4 @@ - - - - - junit - junit - ${junit.version} - - - - - \ No newline at end of file diff --git a/thread-basis/pom.xml b/thread-basis/pom.xml index 0b5f1d5..8c3532b 100644 --- a/thread-basis/pom.xml +++ b/thread-basis/pom.xml @@ -6,7 +6,7 @@ org.lester - parent + concurrent-programming-for-java 1.0-SNAPSHOT ../pom.xml diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin.java b/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin.java new file mode 100644 index 0000000..b1bfd7e --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin.java @@ -0,0 +1,36 @@ +package org.lester.concurrence.chapterFive; + +import java.util.Optional; +import java.util.stream.IntStream; + +/** + * Created by Dr.Lester on 2017/11/25. + */ +public class ThreadJoin { + + public static void main(String[] args) { + Thread t1 = new Thread(()->{ + IntStream.range(1, 1000) + .forEach(i->System.out.println(Thread.currentThread().getName() + "->" + i)); + }); + + Thread t2 = new Thread(()->{ + IntStream.range(1, 1000) + .forEach(i->System.out.println(Thread.currentThread().getName() + "->" + i)); + }); + + t1.start(); + t2.start(); + try { + t1.join(); + t2.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + Optional.of("所有的任务都完成了").ifPresent(System.out::println); + // 主线程也做一遍 + IntStream.range(1, 1000) + .forEach(i->System.out.println(Thread.currentThread().getName() + "->" + i)); + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin2.java b/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin2.java new file mode 100644 index 0000000..bd028cc --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin2.java @@ -0,0 +1,35 @@ +package org.lester.concurrence.chapterFive; + +import java.util.Optional; +import java.util.stream.IntStream; + +/** + * Created by Dr.Lester on 2017/11/25. + */ +public class ThreadJoin2 { + + public static void main(String[] args) throws InterruptedException { + Thread t1 = new Thread(() -> { + try { + System.out.println("t1--运行中"); + Thread.sleep(10_000); + System.out.println("t1--任务完成"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + + t1.start(); + try { + // 等待100毫秒10纳秒 + t1.join(100,10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + Optional.of("所有的任务都完成了").ifPresent(System.out::println); + IntStream.range(1, 1000) + .forEach(i->System.out.println(Thread.currentThread().getName() + "->" + i)); + + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin3.java b/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin3.java new file mode 100644 index 0000000..a6d857f --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterFive/ThreadJoin3.java @@ -0,0 +1,62 @@ +package org.lester.concurrence.chapterFive; + +/** + * Created by Dr.Lester on 2017/11/25. + */ +public class ThreadJoin3 { + + public static void main(String[] args) { + // 开始时间 + long startTimestamp = System.currentTimeMillis(); + + Thread t1 = new Thread(new CaptureRunnable("第一台机器", 10000L)); + Thread t2 = new Thread(new CaptureRunnable("第二台机器", 30000L)); + Thread t3 = new Thread(new CaptureRunnable("第三台机器", 15000L)); + + t1.start(); + t2.start(); + t3.start(); + + try { + t1.join(); + t2.join(); + t3.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + // 结束时间 + long endTimestamp = System.currentTimeMillis(); + System.out.printf("保存数据开始时间戳:%s, 结束时间戳:%s\n", startTimestamp, endTimestamp); + } +} + +class CaptureRunnable implements Runnable { + + // 采集的机器 + private String machineNmae; + + // 采集时间 + private long spendTime; + + public CaptureRunnable(String machineNmae, long spendTime) { + this.machineNmae = machineNmae; + this.spendTime = spendTime; + } + + @Override + public void run() { + try { + // 模拟采集 + Thread.sleep(spendTime); + System.out.printf(machineNmae + "完成数据捕获的时间戳:%s 并成功完成.\n", System.currentTimeMillis()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + // 采集结果 + public String getResult() { + return machineNmae+ "采集完成."; + } +} \ No newline at end of file diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterFour/DaemonThread.java b/thread-basis/src/main/java/org/lester/concurrence/chapterFour/DaemonThread.java new file mode 100644 index 0000000..3835535 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterFour/DaemonThread.java @@ -0,0 +1,39 @@ +package org.lester.concurrence.chapterFour; + +/** + * Created by Dr.Lester on 2017/10/20. + */ +public class DaemonThread { + + public static void main(String[] args) throws InterruptedException { + Thread t = new Thread() { + + @Override + public void run() { + try { + System.out.println(Thread.currentThread().getName()+" running"); + Thread.sleep(20000); + System.out.println(Thread.currentThread().getName()+" done."); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; // new + + // 设置为守护线程 + t.setDaemon(true); + + // runnable -> running | - >dead | -> blocked + t.start(); + t.getName(); + + Thread.sleep(10_000); // JDK1.7新特性 + System.out.println(Thread.currentThread().getName()); + } + + +/** + * A(client)<--------------------------->B(server) + * ->daemonThread(health check) + */ +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterFour/DaemonThread2.java b/thread-basis/src/main/java/org/lester/concurrence/chapterFour/DaemonThread2.java new file mode 100644 index 0000000..421f561 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterFour/DaemonThread2.java @@ -0,0 +1,35 @@ +package org.lester.concurrence.chapterFour; + +/** + * Created by Dr.Lester on 2017/10/22. + */ +public class DaemonThread2 { + + public static void main(String[] args) { + Thread t = new Thread(()->{ + Thread innerThread = new Thread(()->{ + try { + while (true) { + System.out.println("心跳检查ing..."); + Thread.sleep(100_000); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + },"L"); + + innerThread.setDaemon(true); + innerThread.start(); + + try { + Thread.sleep(1_000); + System.out.println("T线程运行结束..."); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + + //t.setDaemon(true); + t.start(); + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterFour/ThreadSimpleAPI.java b/thread-basis/src/main/java/org/lester/concurrence/chapterFour/ThreadSimpleAPI.java new file mode 100644 index 0000000..bafcee6 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterFour/ThreadSimpleAPI.java @@ -0,0 +1,26 @@ +package org.lester.concurrence.chapterFour; + +import java.util.Optional; + +/** + * Created by Dr.Lester on 2017/11/12. + */ +public class ThreadSimpleAPI { + + public static void main(String[] args) { + Thread t = new Thread(() -> { + Optional.of("Hello").ifPresent(System.out::println); + try { + Thread.sleep(100_000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }, "t1"); + + t.start(); + Optional.of(t.getName()).ifPresent(System.out::println); + Optional.of(t.getId()).ifPresent(System.out::println); + Optional.of(t.getPriority()).ifPresent(System.out::println); + } + +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterFour/ThreadSimpleAPI2.java b/thread-basis/src/main/java/org/lester/concurrence/chapterFour/ThreadSimpleAPI2.java new file mode 100644 index 0000000..d2cc7e1 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterFour/ThreadSimpleAPI2.java @@ -0,0 +1,39 @@ +package org.lester.concurrence.chapterFour; + +import java.util.Optional; + +/** + * Created by Dr.Lester on 2017/11/12. + */ +public class ThreadSimpleAPI2 { + + public static void main(String[] args) { + Thread t1 = new Thread(() -> { + for (int i = 0; i < 1000; i++) { + Optional.of(Thread.currentThread().getName() + "-index" + i).ifPresent(System.out::println); + } + }, "t1"); + // 最高优先级 10 + t1.setPriority(Thread.MAX_PRIORITY); + + Thread t2 = new Thread(() -> { + for (int i = 0; i < 1000; i++) { + Optional.of(Thread.currentThread().getName() + "-index" + i).ifPresent(System.out::println); + } + }, "t2"); + // 标准优先级 5 + t2.setPriority(Thread.NORM_PRIORITY); + + Thread t3 = new Thread(() -> { + for (int i = 0; i < 1000; i++) { + Optional.of(Thread.currentThread().getName() + "-index" + i).ifPresent(System.out::println); + } + }, "t3"); + // 最低优先级 1 + t3.setPriority(Thread.MIN_PRIORITY); + + t1.start(); + t2.start(); + t3.start(); + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterSix/ThreadInterrupt.java b/thread-basis/src/main/java/org/lester/concurrence/chapterSix/ThreadInterrupt.java new file mode 100644 index 0000000..383826b --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterSix/ThreadInterrupt.java @@ -0,0 +1,83 @@ +package org.lester.concurrence.chapterSix; + + +/** + * Created by Dr.Lester on 2017/11/26. + */ +public class ThreadInterrupt { + + private static final Object MONITOR = new Object(); + + public static void main(String[] args) { + + /*Thread t = new Thread() { + @Override + public void run() { + while (true) { + synchronized (MONITOR) { + try { + MONITOR.wait(10); + } catch (InterruptedException e) { + e.printStackTrace(); + System.out.println(isInterrupted()); + } + } + } + } + }; + + t.start(); + Thread.sleep(100); + System.out.println(t.isInterrupted()); + t.interrupt(); + System.out.println(t.isInterrupted()); + + //t.stop();*/ + + + /*Thread t = new Thread(() -> { + while (true) { + synchronized (MONITOR) { + try { + MONITOR.wait(10); + } catch (InterruptedException e) { + e.printStackTrace(); + System.out.println(Thread.interrupted()); + } + } + } + });*/ + + Thread t = new Thread() { + @Override + public void run() { + while (true) { + + } + } + }; + + t.start(); + Thread main = Thread.currentThread(); + Thread t2 = new Thread() { + @Override + public void run() { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + main.interrupt(); + System.out.println("interrupt"); + } + }; + + t2.start(); + try { + t.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread.java b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread.java new file mode 100644 index 0000000..edfc339 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread.java @@ -0,0 +1,39 @@ +package org.lester.concurrence.chapterThree; + +/** + * Created by Dr.Lester on 2017/10/2. + * 创建线程 + */ +public class CreateThread { + + public static void main(String[] args) { + Thread t1 = new Thread(); + + Thread t2 = new Thread() { + @Override + public void run () { + System.out.println("我是run()方法"); + } + }; + + Thread t3 = new Thread("ThreadName"); + + Thread t4 = new Thread(()-> { + System.out.println("Runnable..."); + }); + + Thread t5 = new Thread(()-> { + System.out.println("Runnable..." + Thread.currentThread().getName()); + }, "RunnableThread"); + + t1.start(); + t2.start(); + t3.start(); + t4.start(); + t5.start(); + System.out.println(t1.getName()); + System.out.println(t1.getName()); + System.out.println(t3.getName()); + System.out.println(t4.getName()); + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread2.java b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread2.java new file mode 100644 index 0000000..fd2ada9 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread2.java @@ -0,0 +1,36 @@ +package org.lester.concurrence.chapterThree; + +import java.util.Arrays; + +/** + * Created by Dr.Lester on 2017/10/2. + */ +public class CreateThread2 { + + public static void main(String[] args) { + Thread t = new Thread("T"){ + @Override + public void run() { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + t.start(); + //System.out.println("T线程的ThreadGroup:" + t.getThreadGroup()); + //System.out.println("main线程的ThreadGroup:" + Thread.currentThread().getName()); + //System.out.println("main线程爹的ThreadGroup:" + Thread.currentThread().getThreadGroup().getName()); + + ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); + //System.out.println(threadGroup.activeCount()); + + Thread[] threads = new Thread[threadGroup.activeCount()]; + threadGroup.enumerate(threads); + Arrays.asList(threads).forEach(System.out::println); + /*for (Thread temp : threads) { + System.out.println(temp); + }*/ + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread3.java b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread3.java new file mode 100644 index 0000000..b74a664 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread3.java @@ -0,0 +1,24 @@ +package org.lester.concurrence.chapterThree; + +/** + * Created by Dr.Lester on 2017/10/2. + */ +public class CreateThread3 { + + // 计数器 + private static int counter = 0; + + public static void main(String[] args) { + try { + add(0); + } catch (Error e) { + e.printStackTrace(); + System.out.println(counter); + } + } + + private static void add(int i) { + ++counter; + add(i + 1); + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread4.java b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread4.java new file mode 100644 index 0000000..69c6279 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread4.java @@ -0,0 +1,31 @@ +package org.lester.concurrence.chapterThree; + +/** + * Created by Dr.Lester on 2017/10/2. + */ +public class CreateThread4 { + + // 计数器 + private static int counter = 1; + + public static void main(String[] args) { + + Thread t = new Thread(null,new Runnable() { + @Override + public void run() { + try { + add(1); + } catch (Error e) { + e.printStackTrace(); + System.out.println(counter); + } + } + + private void add(int i) { + ++counter; + add(i + 1); + } + },"myThread", 1 << 24); + t.start(); + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread5.java b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread5.java new file mode 100644 index 0000000..ab1e1f7 --- /dev/null +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterThree/CreateThread5.java @@ -0,0 +1,35 @@ +package org.lester.concurrence.chapterThree; + +/** + * Created by Dr.Lester on 2017/10/2. + */ +public class CreateThread5 { + + private static int counter = 1; + + public static void main(String[] args) { + + try { + for (int i = 0; i < Integer.MAX_VALUE; i++) { + counter++; + new Thread(new Runnable() { + @Override + public void run() { + try { + add(1); + } catch (Error e) { +// System.out.println(counter); + } + } + + private void add(int i) { + add(i + 1); + } + }).start(); + } + } catch (Error e) { + counter++; + } + System.out.println("总线程数=>" + counter); + } +} diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/BankHall.java b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/BankHall.java index 549a9d9..60f536e 100644 --- a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/BankHall.java +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/BankHall.java @@ -1,7 +1,7 @@ package org.lester.concurrence.chapterTwo; /** - * Created by Godql on 2017/10/1. + * Created by Dr.Lester on 2017/10/1. * 银行大厅 */ public class BankHall { diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/BankHall2.java b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/BankHall2.java index f1a9d30..d7ffa56 100644 --- a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/BankHall2.java +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/BankHall2.java @@ -1,7 +1,7 @@ package org.lester.concurrence.chapterTwo; /** - * Created by Godql on 2017/10/1. + * Created by Dr.Lester on 2017/10/1. * 银行大厅 * Versions 1.2 */ diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/CounterWindowRunnable.java b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/CounterWindowRunnable.java index ac46bf5..d608334 100644 --- a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/CounterWindowRunnable.java +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/CounterWindowRunnable.java @@ -1,7 +1,7 @@ package org.lester.concurrence.chapterTwo; /** - * Created by Godql on 2017/10/1. + * Created by Dr.Lester on 2017/10/1. * 柜台窗口 * Versions 1.2 */ diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/ICalculativeStrategy.java b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/ICalculativeStrategy.java index a0ecafa..d4e627b 100644 --- a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/ICalculativeStrategy.java +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/ICalculativeStrategy.java @@ -1,7 +1,7 @@ package org.lester.concurrence.chapterTwo; /** - * Created by Godql on 2017/10/1. + * Created by Dr.Lester on 2017/10/1. * 计算策略 */ @FunctionalInterface diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/CalculativeStrategyImpl.java b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/ICalculativeStrategyImpl.java similarity index 72% rename from thread-basis/src/main/java/org/lester/concurrence/chapterTwo/CalculativeStrategyImpl.java rename to thread-basis/src/main/java/org/lester/concurrence/chapterTwo/ICalculativeStrategyImpl.java index 0898fc7..1fa33bd 100644 --- a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/CalculativeStrategyImpl.java +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/ICalculativeStrategyImpl.java @@ -1,9 +1,9 @@ package org.lester.concurrence.chapterTwo; /** - * Created by Godql on 2017/10/1. + * Created by Dr.Lester on 2017/10/1. */ -public class CalculativeStrategyImpl implements ICalculativeStrategy { +public class ICalculativeStrategyImpl implements ICalculativeStrategy { private final static double SALARY_RATE = 0.1; private final static double BONUS_RATE = 0.15; diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/TaxCalculator.java b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/TaxCalculator.java index 95b84b5..0e2cb7b 100644 --- a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/TaxCalculator.java +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/TaxCalculator.java @@ -1,7 +1,7 @@ package org.lester.concurrence.chapterTwo; /** - * Created by Godql on 2017/10/1. + * Created by Dr.Lester on 2017/10/1. * 计算器:计算税务 */ public class TaxCalculator { diff --git a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/TaxCalculatorMain.java b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/TaxCalculatorMain.java index c528e48..2022fd2 100644 --- a/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/TaxCalculatorMain.java +++ b/thread-basis/src/main/java/org/lester/concurrence/chapterTwo/TaxCalculatorMain.java @@ -1,7 +1,7 @@ package org.lester.concurrence.chapterTwo; /** - * Created by Godql on 2017/10/1. + * Created by Dr.Lester on 2017/10/1. * 计算 */ public class TaxCalculatorMain { diff --git a/thread-design-pattern/pom.xml b/thread-design-pattern/pom.xml index 1fc68cd..5f06dfd 100644 --- a/thread-design-pattern/pom.xml +++ b/thread-design-pattern/pom.xml @@ -6,7 +6,7 @@ org.lester - parent + concurrent-programming-for-java 1.0-SNAPSHOT ../pom.xml