diff --git a/README.md b/README.md index 8cf0f34..dbc8d41 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,57 @@ -# 参考文章 +## 参考文章 -[JavaEE基础(01):Servlet实现方式,生命周期执行过程](https://mp.weixin.qq.com/s?__biz=MzU4Njg0MzYwNw==&mid=2247484304&idx=1&sn=dd6b6852e35031dd07f70d441f3ddc85&chksm=fdf45728ca83de3e158597030cf46b1677eccf533f9e1412690cd64b0ec0cce544711ceabddb&token=1248678182&lang=zh_CN#rd)
-[JavaEE基础(02):Servlet核心API用法详解](https://mp.weixin.qq.com/s?__biz=MzU4Njg0MzYwNw==&mid=2247484309&idx=1&sn=fc8237aef2f246f85b978561f4b37e1e&chksm=fdf4572dca83de3b8affdf4a9a8c8b3c18e4c5203c3e663e0bfaeb53788d3e2d26fa829bb8c6&token=1248678182&lang=zh_CN#rd)
-[JavaEE基础(03):Http请求详解,握手挥手流程简介](https://mp.weixin.qq.com/s?__biz=MzU4Njg0MzYwNw==&mid=2247484318&idx=1&sn=125780e20ada2f3d1451a1563a1c1e6f&chksm=fdf45726ca83de30adc5956a16d16151825b37c0adf5350214899ade39fef47f17ee35b2390d&token=1248678182&lang=zh_CN#rd)
-[JavaEE基础(04):会话跟踪技术,Session和Cookie详解](https://mp.weixin.qq.com/s?__biz=MzU4Njg0MzYwNw==&mid=2247484325&idx=1&sn=a3c96cff45fac355d947dff9e7f5b9bf&chksm=fdf4571dca83de0b590bbc2864561c33b4b7af512d5b0dce86eca83170a23f007a1786d22f8c&token=362281359&lang=zh_CN#rd)
-[JavaEE基础(05):过滤器、监听器、拦截器,应用详解](https://mp.weixin.qq.com/s?__biz=MzU4Njg0MzYwNw==&mid=2247484330&idx=1&sn=2754da84764ba5db8bccb1112881af3e&chksm=fdf45712ca83de04848d00451ce473275514ec8e60786c6f8db355190b0360463eb10da6c94c&token=362281359&lang=zh_CN#rd)
-[JavaEE基础(06):Servlet整合C3P0数据库连接池](https://mp.weixin.qq.com/s?__biz=MzU4Njg0MzYwNw==&mid=2247484335&idx=1&sn=6755f997766ceb8b81c83201ba101553&chksm=fdf45717ca83de01b39de0f3e5ca15607d12960cf5f9e2df391bc6c6af0808018dd2b1969a73&token=362281359&lang=zh_CN#rd)
+### JVM虚拟机系列 + +|序号|文章标题| +|:---:|:---| +|01|[虚拟机系列:JVM特点,基础结构与执行周期](https://mp.weixin.qq.com/s/6mODRDVrw6z1ok5hFWvi3A)| +|02|[虚拟机系列:JVM类加载机制](https://mp.weixin.qq.com/s/buJo4c2K_9Y7qRUEp_l2kg)| +|03|[虚拟机系列:JVM运行时数据区](https://mp.weixin.qq.com/s/CMvhvV5kwzijq2t9eqlsoA)| +|04|[虚拟机系列:JVM执行引擎和垃圾回收](https://mp.weixin.qq.com/s/yN3q038pFnKN1hnBgO_Y6g)| + +### JavaSE基础篇 + +|序号|文章标题| +|:---:|:---| +|01|[Java基础:基本数据类型,核心点整理](https://mp.weixin.qq.com/s/YwrBptAd2SrWefFIiN86Yw)| +|02|[Java基础:特殊的String类,和相关扩展API](https://mp.weixin.qq.com/s/HI6yklzR118G2Y-rJzl47g)| +|03|[Java基础:流程控制语句,和算法应用](https://mp.weixin.qq.com/s/K7VqhbOJ7nMrFtfQgUKY0Q)| + +### JavaSE并发篇 + +|序号|文章标题| +|:---:|:---| +|01|[Java并发:线程的创建方式,状态周期管理](https://mp.weixin.qq.com/s/h0zuh364It-fDtQyYdzIwA)| +|02|[Java并发:线程核心机制,基础概念扩展](https://mp.weixin.qq.com/s/nU5tbKuAiDf_LDu-8A4Etg)| +|03|[Java并发:多线程并发访问,同步控制](https://mp.weixin.qq.com/s/xWhd3vgYPNp-Mm2lJpmFmA)| +|04|[Java并发:线程间通信,等待/通知机制](https://mp.weixin.qq.com/s/WWbVjvkEqpddx605me9E-A)| +|05|[Java并发:悲观锁和乐观锁机制](https://mp.weixin.qq.com/s/t6NshbuKwULPeLhTIhvmIg)| +|06|[Java并发:Lock机制下API用法详解](https://mp.weixin.qq.com/s/F7TC-71kEIpG6VD2eF6NIw)| +|07|[Java并发:Fork/Join框架机制详解](https://mp.weixin.qq.com/s/kk5q0mtBawCSa6365t3IWw)| +|08|[Java并发:Executor线程池框架简介](https://mp.weixin.qq.com/s/jvOl-bxVC1e4L2O329OIyg)| + +### JavaEE基础篇 + +|序号|文章标题| +|:---:|:---| +|01|[Servlet实现方式,生命周期执行过程](https://mp.weixin.qq.com/s/0YMhMX4ET1BxyGJi01grnw)| +|02|[Servlet核心API用法详解](https://mp.weixin.qq.com/s/gC9xknmXLvC7WlwEpPSWXQ)| +|03|[Http请求详解,握手挥手流程简介](https://mp.weixin.qq.com/s/IhrIdiLu2kxe2npgix8KTg)| +|04|[会话跟踪技术,Session和Cookie详解](https://mp.weixin.qq.com/s/8cEgI49Tbb4ezxZEvEq8tg)| +|05|[过滤器、监听器、拦截器,应用详解](https://mp.weixin.qq.com/s/CVhLyZ12BbT9kaclSpIrnw)| +|06|[Servlet整合C3P0数据库连接池](https://mp.weixin.qq.com/s/I-KB6vAEwVMBAVAjEP2RmQ)| + +### 编程体系整理 + +|序号|文章标题| +|:---:|:---| +|01|[编程体系结构:Java编程基础](https://mp.weixin.qq.com/s/8ZQdT8Gwyax51tV2yLYbBg)| +|02|[编程体系结构:Java异常体系](https://mp.weixin.qq.com/s/yHCC-MwFtDda_y817CV2XA)| +|03|[编程体系结构:Java集合容器](https://mp.weixin.qq.com/s/Bx_vusOPzyvg8EDwoubAOA)| +|04|[编程体系结构:JavaIO流文件管理](https://mp.weixin.qq.com/s/EakhE835U-0v9diDRayspw)| +|05|[编程体系结构:Java多线程并发](https://mp.weixin.qq.com/s/xCJlBFg9_wOmJz_THBNNeA)| +|06|[编程体系结构:Java面向对象](https://mp.weixin.qq.com/s/OLmY3t8L4jDL6lg_8jWV2g)| +|07|[编程体系结构:JavaEE之Web开发](https://mp.weixin.qq.com/s/ImM3juO6OhEkEdOZMH2N-g)| 持续更新中... @@ -14,19 +60,27 @@ Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结。 ## 关于作者 -【公众号:知了一笑】 【知乎专栏
-
+

+公众号 +码云 +知乎 +简书 +博客园 +CSDN +

+ +
+ ## 推荐项目 -|项目名称|GitHub地址|GitEE地址|推荐指数| -|:---|:---|:---|:---| -|Java描述常用设计模式,算法,数据结构|[GitHub·点这里](https://github.com/cicadasmile/model-arithmetic-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/model-arithmetic-parent)|☆☆☆☆☆| -|Java基础、进阶、并发、面向对象、Web开发|[GitHub·点这里](https://github.com/cicadasmile/java-base-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/java-base-parent)|☆☆☆☆| -|SpringCloud微服务架构实战综合案例|[GitHub·点这里](https://github.com/cicadasmile/husky-spring-cloud)|[GitEE·点这里](https://gitee.com/cicadasmile/husky-spring-cloud)|☆☆☆☆☆| -|SpringCloud微服务基础组件案例详解|[GitHub·点这里](https://github.com/cicadasmile/spring-cloud-base)|[GitEE·点这里](https://gitee.com/cicadasmile/spring-cloud-base)|☆☆☆| -|SpringCloud实现分库分表模式下数据库实时扩容|[GitHub·点这里](https://github.com/cicadasmile/cloud-shard-jdbc)|[GitEE·点这里](https://gitee.com/cicadasmile/cloud-shard-jdbc)|☆☆☆☆☆| -|SpringBoot框架基础应用入门到进阶|[GitHub·点这里](https://github.com/cicadasmile/spring-boot-base)|[GitEE·点这里](https://gitee.com/cicadasmile/spring-boot-base)|☆☆☆☆| -|SpringBoot框架整合开发常用中间件|[GitHub·点这里](https://github.com/cicadasmile/middle-ware-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/middle-ware-parent)|☆☆☆☆☆| -|Spring+Mvc框架基础案例详解|[GitHub·点这里](https://github.com/cicadasmile/spring-mvc-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/spring-mvc-parent)|☆☆| -|Linux系统基础、运维,常用操作积累|[GitHub·点这里](https://github.com/cicadasmile/linux-system-base)|[GitEE·点这里](https://gitee.com/cicadasmile/linux-system-base)|☆☆☆| +|序号|项目名称|GitHub地址|GitEE地址|推荐指数| +|:---|:---|:---|:---|:---| +|01|Java描述设计模式,算法,数据结构|[GitHub·点这里](https://github.com/cicadasmile/model-arithmetic-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/model-arithmetic-parent)|☆☆☆☆☆| +|02|Java基础、并发、面向对象、Web开发|[GitHub·点这里](https://github.com/cicadasmile/java-base-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/java-base-parent)|☆☆☆☆| +|03|SpringCloud微服务基础组件案例详解|[GitHub·点这里](https://github.com/cicadasmile/spring-cloud-base)|[GitEE·点这里](https://gitee.com/cicadasmile/spring-cloud-base)|☆☆☆| +|04|SpringCloud微服务架构实战综合案例|[GitHub·点这里](https://github.com/cicadasmile/husky-spring-cloud)|[GitEE·点这里](https://gitee.com/cicadasmile/husky-spring-cloud)|☆☆☆☆☆| +|05|SpringBoot框架基础应用入门到进阶|[GitHub·点这里](https://github.com/cicadasmile/spring-boot-base)|[GitEE·点这里](https://gitee.com/cicadasmile/spring-boot-base)|☆☆☆☆| +|06|SpringBoot框架整合开发常用中间件|[GitHub·点这里](https://github.com/cicadasmile/middle-ware-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/middle-ware-parent)|☆☆☆☆☆| +|07|数据管理、分布式、架构设计基础案例|[GitHub·点这里](https://github.com/cicadasmile/data-manage-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/data-manage-parent)|☆☆☆☆☆| +|08|大数据系列、存储、组件、计算等框架|[GitHub·点这里](https://github.com/cicadasmile/big-data-parent)|[GitEE·点这里](https://gitee.com/cicadasmile/big-data-parent)|☆☆☆☆☆| diff --git a/java-se-base-parent/model-data-type/pom.xml b/java-se-base-parent/model-data-type/pom.xml new file mode 100644 index 0000000..923f5a2 --- /dev/null +++ b/java-se-base-parent/model-data-type/pom.xml @@ -0,0 +1,15 @@ + + + + java-se-base-parent + com.java.se.parent + 1.0-SNAPSHOT + + 4.0.0 + com.data.type + model-data-type + + + \ No newline at end of file diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/HelloDataType.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/HelloDataType.java new file mode 100644 index 0000000..43f1baf --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/HelloDataType.java @@ -0,0 +1,7 @@ +package com.data.type; + +public class HelloDataType { + public static void main(String[] args) { + System.out.println("基础数据类型模块"); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType01.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType01.java new file mode 100644 index 0000000..41a065a --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType01.java @@ -0,0 +1,12 @@ +package com.data.type.block01base; + +public class IntType01 { + public static void main(String[] args) { + System.out.println("进制位数:"+Integer.SIZE); + System.out.println("最小值:"+Integer.MIN_VALUE); + System.out.println("最大值:"+Integer.MAX_VALUE); + System.out.println("进制位数:"+Double.SIZE); + System.out.println("最小值:"+Double.MIN_VALUE); + System.out.println("最大值:"+Double.MAX_VALUE); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType02.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType02.java new file mode 100644 index 0000000..3297a94 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType02.java @@ -0,0 +1,18 @@ +package com.data.type.block01base; + + +public class IntType02 { + public static void main(String[] args) { + // 自动转换 + int i = 112 ; + long j = i ; + System.out.println(j); + // 强制转换 + double d = 13.14 ; + int f = (int)d; + System.out.println(f); + // 类型提升 + long r = i * j ; + System.out.println(r); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType03.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType03.java new file mode 100644 index 0000000..52404ba --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType03.java @@ -0,0 +1,9 @@ +package com.data.type.block01base; + +public class IntType03 { + public static void main(String[] args) { + Integer int1 = null ; + Double dou1 = 13.14 ; + Long lon1 = 123L ; + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType04.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType04.java new file mode 100644 index 0000000..290d530 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType04.java @@ -0,0 +1,8 @@ +package com.data.type.block01base; + +public class IntType04 { + public static void main(String[] args) { + char cha1 = '知'; + System.out.println(cha1); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType05.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType05.java new file mode 100644 index 0000000..0e359bd --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType05.java @@ -0,0 +1,10 @@ +package com.data.type.block01base; + +public class IntType05 { + public static void main(String[] args) { + short s1 = 1 ; + // s1 = s1 + 1 ; // 变异错误:s1自动向int类型转换 + s1 += 1 ; + System.out.println(s1); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType06.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType06.java new file mode 100644 index 0000000..8cafae5 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType06.java @@ -0,0 +1,12 @@ +package com.data.type.block01base; + +public class IntType06 { + public static void main(String[] args) { + // 存在精度损失问题:0.30000000000000004 + System.out.println(3*0.1); + // true + System.out.println(0.3 == 0.3); + // false + System.out.println(3*0.1 == 0.3); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType07.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType07.java new file mode 100644 index 0000000..3a2383b --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType07.java @@ -0,0 +1,13 @@ +package com.data.type.block01base; + +public class IntType07 { + public static void main(String[] args) { + // float 声明 + float f1 = 12.3f ; + // double 声明 + double d1 = 13.4 ; + // 向下转型,需要强制转换 + float f2 = (float) d1 ; + System.out.println("f1="+f1+";d1="+d1+";f2="+f2); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType08.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType08.java new file mode 100644 index 0000000..6c30db5 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block01base/IntType08.java @@ -0,0 +1,25 @@ +package com.data.type.block01base; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class IntType08 { + public static void main(String[] args) { + BigDecimal dec1 = new BigDecimal(3.0) ; + BigDecimal dec2 = new BigDecimal(2.11) ; + // 精确加法运算 + BigDecimal res1 = dec1.add(dec2) ; + System.out.println(res1); + // 精确减法运算,并截取结果 + // HALF_UP:四舍五入 + BigDecimal res2 = dec1.subtract(dec2); + System.out.println(res2.setScale(1, RoundingMode.HALF_UP)); + // 精确乘法运算 + BigDecimal res3 = dec1.multiply(dec2) ; + System.out.println(res3.doubleValue()); + // 精确除法运算,并截取结果 + // ROUND_DOWN:直接按保留位数截取 + BigDecimal res4 = dec1.divide(dec2,2,BigDecimal.ROUND_DOWN); + System.out.println(res4); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String01.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String01.java new file mode 100644 index 0000000..35f6bb2 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String01.java @@ -0,0 +1,11 @@ +package com.data.type.block02string; + +/** + * 字符串声明 + */ +public class String01 { + public static void main(String[] args) { + String var1 = "cicada" ; + String var2 = new String("smile") ; + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String02.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String02.java new file mode 100644 index 0000000..a46711b --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String02.java @@ -0,0 +1,25 @@ +package com.data.type.block02string; + +public class String02 { + public static void main(String[] args) { + String var1 = "cicada" ; + String var2 = "cicada" ; + // true;true + System.out.println((var1==var2)+";"+var1.equals(var2)); + String var3 = new String("cicada"); + String var4 = new String("cicada"); + // false;true + System.out.println((var3==var4)+";"+var3.equals(var4)); + // false;true + System.out.println((var1==var4)+";"+var2.equals(var4)); + String var5 = "ci"+"cada"; + // true;true + System.out.println((var1==var5)+";"+var5.equals(var4)); + String var6 = new String02().getVar6 () ; + // true;true + System.out.println((var1==var6)+";"+var6.equals(var4)); + } + public String getVar6 (){ + return "cicada" ; + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String03.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String03.java new file mode 100644 index 0000000..38b77fd --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String03.java @@ -0,0 +1,26 @@ +package com.data.type.block02string; + +import java.nio.charset.Charset; +import java.util.Arrays; + +public class String03 { + public static void main(String[] args) throws Exception { + String value = "Hello,知了"; + // UTF-8 + byte[] defaultCharset = value.getBytes(Charset.defaultCharset()); + System.out.println(Arrays.toString(defaultCharset)); + System.out.println(new String(defaultCharset,"UTF-8")); + // GBK + byte[] gbkCharset = value.getBytes("GBK"); + System.out.println(Arrays.toString(gbkCharset)); + System.out.println(new String(gbkCharset,"GBK")); + // ISO-8859-1:表示的字符范围很窄,无法表示中文字符,转换之后无法解码 + byte[] isoCharset = value.getBytes("ISO8859-1"); + System.out.println(Arrays.toString(isoCharset)); + System.out.println(new String(isoCharset,"ISO8859-1")); + // UTF-16 + byte[] utf16Charset = value.getBytes("UTF-16"); + System.out.println(Arrays.toString(utf16Charset)); + System.out.println(new String(utf16Charset,"UTF-16")); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String04.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String04.java new file mode 100644 index 0000000..6c4f66a --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String04.java @@ -0,0 +1,22 @@ +package com.data.type.block02string; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class String04 { + public static void main(String[] args) { + // 指定位置拼接字符串 + String var1 = formatStr("cicada","smile"); + System.out.println("var1="+var1); + // 格式化日期:2020-03-07 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date() ; + System.out.println(format.format(date)); + // 浮点数:此处会四舍五入 + double num = 3.14159; + System.out.print(String.format("浮点类型:%.3f %n", num)); + } + public static String formatStr (String ...var){ + return String.format("key:%s:route:%s",var); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String05.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String05.java new file mode 100644 index 0000000..5237992 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String05.java @@ -0,0 +1,17 @@ +package com.data.type.block02string; + +public class String05 { + String var1 = "hello" ; + int[] intArr = {1,2,3}; + public static void main(String[] args) { + String05 objStr = new String05() ; + objStr.change(objStr.var1,objStr.intArr); + // hello 4 + System.out.println(objStr.var1); + System.out.println(objStr.intArr[2]); + } + public void change (String var1,int[] intArr){ + var1 = "world" ; + intArr[2] = 4 ; + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String06.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String06.java new file mode 100644 index 0000000..0e13a29 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String06.java @@ -0,0 +1,15 @@ +package com.data.type.block02string; + +import java.util.UUID; + +public class String06 { + public static void main(String[] args) { + System.out.println(StringUtil.getUUid()); + } +} +class StringUtil { + private StringUtil(){} + public static String getUUid (){ + return UUID.randomUUID().toString().replace("-",""); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String07.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String07.java new file mode 100644 index 0000000..61cdf1c --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String07.java @@ -0,0 +1,10 @@ +package com.data.type.block02string; + +public class String07 { + public static void main(String[] args) { + StringBuffer var = new StringBuffer(2) ; + var.append("what"); + var.append("when"); + System.out.println(var); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String08.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String08.java new file mode 100644 index 0000000..f4b210d --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String08.java @@ -0,0 +1,9 @@ +package com.data.type.block02string; + +public class String08 { + public static void main(String[] args) { + StringBuilder var = new StringBuilder() ; + var.append("how").append("what") ; + System.out.println(var); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String09.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String09.java new file mode 100644 index 0000000..6ff506d --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block02string/String09.java @@ -0,0 +1,24 @@ +package com.data.type.block02string; + +public class String09 { + public static void main(String[] args) { + String var1 = new String("A"); + String var2 = new String("B"); + StringBuffer var3 = new StringBuffer("C"); + StringBuffer var4 = new StringBuffer("D"); + join(var1,var2); + join(var3,var4); + //A<>B + System.out.println(var1+"<>"+var2); + //C<>DD + System.out.println(var3+"<>"+var4); + } + public static void join (String s1,String s2){ + s1 = s2 ; + s2 = s1+s2 ; + } + public static void join (StringBuffer s1,StringBuffer s2){ + s1 = s2 ; + s2 = s2.append(s1) ; + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process01.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process01.java new file mode 100755 index 0000000..5544b40 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process01.java @@ -0,0 +1,45 @@ +package com.data.type.block03process; + +/** + * if...else 流程控制 + */ +public class Process01 { + public static void main(String[] args) { + // 演示:Node01 + if (compare01(40,30)){ + System.out.println("40>30:true"); + } else { + System.out.println("40>30:false"); + } + // 演示:Node02 + if (compare01(10,20) && compare01(20,30)){ + System.out.println("条件成立"); + } else { + System.out.println("条件不成立"); + } + // 演示:Node03 + if (compare01(20,10) || compare01(20,30)){ + System.out.println("条件成立"); + } else { + System.out.println("条件不成立"); + } + // 演示:Node04 + if(compare02(1,1)) + if(compare02(2,2)) + System.out.println("Running..."); + // 演示:Node05 + if(compare01(1,2)) + if(compare01(5,3)){ + System.out.println("5>3"); + } + } + + private static boolean compare01 (int num1,int num2){ + System.out.println("判断:num1="+num1+";num2="+num2); + return num1 > num2 ; + } + private static boolean compare02 (int num1,int num2){ + System.out.println("判断:num1="+num1+";num2="+num2); + return num1 == num2 ; + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process02.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process02.java new file mode 100755 index 0000000..7ee87aa --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process02.java @@ -0,0 +1,24 @@ +package com.data.type.block03process; + +/** + * else...if 语句 + */ +public class Process02 { + public static void main(String[] args) { + elseIf(11) ; + elseIf(9) ; + elseIf(5); + } + + private static void elseIf (Integer num){ + if (num > 10){ + System.out.println("num > 10"); + } else if (num > 7){ + System.out.println("num > 7"); + } else if (num > 4){ + System.out.println("num > 4"); + } else { + System.out.println("num < 4"); + } + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process03.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process03.java new file mode 100755 index 0000000..f481ee0 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process03.java @@ -0,0 +1,45 @@ +package com.data.type.block03process; + +import java.util.Scanner; + +/** + * Switch 语句 + */ +public class Process03 { + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + System.out.print("What day is it today:"); + String value = scan.next(); + weekInfo(value); + } + + private static void weekInfo (String value){ + switch (value) { + case "Monday": + System.out.println("Monday"); + break; + case "Tuesday": + System.out.println("Tuesday"); + break; + case "Wednesday": + System.out.println("Wednesday"); + break; + case "Thursday": + System.out.println("Thursday"); + break; + case "Friday": + System.out.println("Friday"); + break; + case "Saturday": + System.out.println("Saturday"); + break; + case "Sunday": + System.out.println("Sunday"); + break; + default: + System.out.println("Matching failure"); + break; + } + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process04.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process04.java new file mode 100755 index 0000000..4424d2e --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process04.java @@ -0,0 +1,33 @@ +package com.data.type.block03process; + +/** + * for 循环 + */ +public class Process04 { + public static void main(String[] args) { + // Node01 + int sum = 0; + for(int i=1; i<=100; i++) { + sum += i; + } + System.out.println(sum); + + // Node02 + String[] nameArr = {"Java","C++","C#"} ; + for (String name:nameArr){ + System.out.println("name="+name); + } + + // Node03 + // 输出 i = 13 + int i = 0; + for (i++; i++ < 10; i++); + System.out.println(++i); + + // 输出:j=3 6 9 + int j = 0; + for (j++; j++ < 10; j++){ + System.out.println(++j); + } + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process05.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process05.java new file mode 100755 index 0000000..a136276 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process05.java @@ -0,0 +1,23 @@ +package com.data.type.block03process; + +/** + * while 和 do while + */ +public class Process05 { + public static void main(String[] args) { + int num1 = 1; + int num2 = 1; + + // while循环 + while(num1 <= 3) { + System.out.println("num1 == " + num1); + num1++; + } + + // do...while循环 + do { + System.out.println("num2 == " + num2); + num2++; + } while(num2 <= 3); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process06.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process06.java new file mode 100755 index 0000000..eea8ec2 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process06.java @@ -0,0 +1,31 @@ +package com.data.type.block03process; + +/** + * Return 语句 + */ +public class Process06 { + public static void main(String[] args) { + System.out.println(getNum1()); + System.out.println(getNum2()); + } + public static int getNum1 (){ + int a =100; + try{ + return a+1; // 这里是运算逻辑,非赋值 + }catch(Exception e){ + e.printStackTrace(); + }finally{ + return a; + } + } + public static int getNum2 (){ + int a =100; + try{ + return a++; // a++ -> a=a+1 此时a的值改变 + }catch(Exception e){ + e.printStackTrace(); + }finally{ + return a; + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process07.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process07.java new file mode 100755 index 0000000..134bd46 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process07.java @@ -0,0 +1,15 @@ +package com.data.type.block03process; + +/** + * break 语句 + */ +public class Process07 { + public static void main(String[] args) { + for (int i = 1 ; i < 3 ; i++){ + if (i == 2){ + break ; + } + System.out.println("i = " + i); + } + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process08.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process08.java new file mode 100755 index 0000000..4731cb1 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process08.java @@ -0,0 +1,15 @@ +package com.data.type.block03process; + +/** + * Continue 语句 + */ +public class Process08 { + public static void main(String[] args) { + for (int i = 1 ; i < 3 ; i++){ + if (i == 1){ + continue ; + } + System.out.println("i = " + i); + } + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process09.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process09.java new file mode 100755 index 0000000..36cfe33 --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process09.java @@ -0,0 +1,23 @@ +package com.data.type.block03process; + +public class Process09 { + public static void main(String[] args) { + int[] score = {9,8,7,6,5} ; + // 排序次数:最多 length - 1 次 + for (int i = 0 ; i < score.length -1 ; i ++){ + // 当前排序的集合区间,排序完一个数据就放弃一个 + for (int j = 0 ; j < score.length - i - 1 ; j++){ + // 冒泡排序:把结果大的向后扔 + if (score[j] > score[j+1]){ + int temp = score[j] ; + score[j] = score[j+1] ; + score[j+1] = temp ; + } + } + } + // 输出排序后的结果集 + for (int i = 0 ; i < score.length ; i++){ + System.out.print(score[i]); + } + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process10.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process10.java new file mode 100755 index 0000000..f39b38a --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process10.java @@ -0,0 +1,31 @@ +package com.data.type.block03process; + +/** + * 排列组合 + */ +public class Process10 { + public static void main(String[] args) { + arrange() ; + } + /** + * 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? + */ + public static void arrange (){ + int i=0; // 百位数 + int j=0; // 十位数 + int k=0; // 个位数 + int t=0; // 计数器 + for (i = 1 ; i <= 4 ; i++){ + for (j = 1 ; j <= 4 ; j++){ + for (k = 1 ; k <=4 ; k++){ + if (i != j && j != k && k != i){ + t += 1 ; + System.out.print(i*100+j*10+k+"--"); + } + } + } + } + System.out.println(); + System.out.println("t="+t); + } +} diff --git a/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process11.java b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process11.java new file mode 100755 index 0000000..db605cd --- /dev/null +++ b/java-se-base-parent/model-data-type/src/main/java/com/data/type/block03process/Process11.java @@ -0,0 +1,48 @@ +package com.data.type.block03process; + +/** + * 递归算法 + */ +public class Process11 { + public static void main(String[] args) { + System.out.println(getSumOne(100)); + System.out.println(getSumTwo(30)); + System.out.println(getSumThree(5)); + } + /** + * 使用递归的方式计算1+2+...+100 + */ + public static int getSumOne (int i){ // 传入100 + int sum ; + if (i == 1){ + return 1 ; + } + else { + sum = i + getSumOne(i - 1) ; + } + return sum ; + } + /** + * 一列数的规则如下: 1、1、2、3、5、8、13、21、34... + * 求第30位数是多少, 用递归算法实现 + */ + public static int getSumTwo (int i){ // 传入第几位数下标 + if (i <= 0){ + return 0 ; + } else if (i == 1 || i == 2){ // 处理前面2位的1,1 + return 1 ; + } else { // 当前位数是前两位之和 + return getSumTwo(i - 1) + getSumTwo(i - 2) ; + } + } + /** + * 1*2*3*...*100 递归计算阶乘 + */ + public static int getSumThree (int i){ + if (i == 1){ + return i ; + } else { + return i * getSumThree (i - 1) ; + } + } +} diff --git a/java-se-base-parent/model-multy-thread/pom.xml b/java-se-base-parent/model-multy-thread/pom.xml new file mode 100644 index 0000000..efa2379 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/pom.xml @@ -0,0 +1,34 @@ + + + + java-se-base-parent + com.java.se.parent + 1.0-SNAPSHOT + + 4.0.0 + com.multy.thread + model-multy-thread + + + ${project.artifactId} + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/HelloThread.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/HelloThread.java new file mode 100644 index 0000000..e59982d --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/HelloThread.java @@ -0,0 +1,24 @@ +package com.multy.thread; + +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; +import java.lang.management.ThreadMXBean; + +/** + * 多线程入门案例 + */ +public class HelloThread { + public static void main(String[] args) { + System.out.println("Hello,Thread"); + // 当前线程名称 + System.out.println(Thread.currentThread().getName()); + // 线程系统的管理接口 + ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); + long[] threadIds = threadMXBean.getAllThreadIds() ; + for (long id : threadIds) { + ThreadInfo threadInfo = threadMXBean.getThreadInfo(id) ; + System.out.println(threadInfo.getThreadId()+ + ":"+threadInfo.getThreadName()); + } + } +} diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread01.java new file mode 100644 index 0000000..b88142b --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread01.java @@ -0,0 +1,21 @@ +package com.multy.thread.block01create; +/** + * 线程创建方式一:继承Thread类 + */ +public class CreateThread01 { + public static void main(String[] args) { + // 调用方法 + MyThread1 myThread1 = new MyThread1() ; + myThread1.start(); + } +} +class MyThread1 extends Thread { + // 设置线程名称 + public MyThread1 (){ + super("CicadaThread"); + } + @Override + public void run() { + System.out.println(Thread.currentThread().getName()); + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread02.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread02.java new file mode 100644 index 0000000..71451a7 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread02.java @@ -0,0 +1,16 @@ +package com.multy.thread.block01create; +/** + * 线程创建方式二:实现 Runnable 接口 + */ +public class CreateThread02 { + public static void main(String[] args) { + Thread thread = new Thread(new MyThread2(),"MyThread2") ; + thread.start(); + } +} +class MyThread2 implements Runnable { + @Override + public void run() { + System.out.println(Thread.currentThread().getName()+" run ..."); + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread03.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread03.java new file mode 100644 index 0000000..f173908 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread03.java @@ -0,0 +1,27 @@ +package com.multy.thread.block01create; +/** + * 线程创建方式三:匿名内部类 + */ +public class CreateThread03 { + public static void main(String[] args) { + //方式1 + new Thread("ThreadName1") { + public void run() { + System.out.println("1:"+Thread.currentThread().getName()); + }; + }.start(); + + //方式2 + new Thread(new Runnable() { + public void run() { + System.out.println("2:"+Thread.currentThread().getName()); + } + },"ThreadName2"){ + // 这里重写了run方法 + @Override + public void run() { + System.out.println("3:"+Thread.currentThread().getName()); + } + }.start(); + } +} diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread04.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread04.java new file mode 100644 index 0000000..536abdd --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread04.java @@ -0,0 +1,31 @@ +package com.multy.thread.block01create; + +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; + +/** + * 线程创建方式四:返回值线程 + */ +public class CreateThread04 { + public static void main(String[] args) throws Exception { + MyThread4 myThread4 = new MyThread4(); + FutureTask task = new FutureTask<>(myThread4); + Thread thread = new Thread(task,"TaskThread"); + thread.start(); + // 等待获取结果 + // Integer result = task.get(); + // 设置获取结果的等待时间,超时抛出:TimeoutException + Integer result = task.get(3, TimeUnit.SECONDS) ; + System.out.println("result="+result); + } +} +class MyThread4 implements Callable { + // 封装线程执行的任务 + @Override + public Integer call() throws Exception { + System.out.println(Thread.currentThread().getName()); + Thread.sleep(1000); + return 2+3; + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread05.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread05.java new file mode 100644 index 0000000..aa4ecfe --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread05.java @@ -0,0 +1,19 @@ +package com.multy.thread.block01create; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * 线程创建方式五:定时任务 + */ +public class CreateThread05 { + public static void main(String[] args) { + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + System.out.println("延迟1s,每隔3s执行一次"); + } + }, 1000, 3000); + } +} diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread06.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread06.java new file mode 100644 index 0000000..7625da0 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/CreateThread06.java @@ -0,0 +1,21 @@ +package com.multy.thread.block01create; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +/** + * 线程创建方式六:线程池 + */ +public class CreateThread06 { + public static void main(String[] args) { + Executor threadPool = Executors.newFixedThreadPool(5); + for(int i = 0 ;i < 5 ; i++) { + threadPool.execute(new Runnable() { + @Override + public void run() { + System.out.println(Thread.currentThread().getName()); + } + }); + } + } +} diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/StateCycle01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/StateCycle01.java new file mode 100644 index 0000000..811ae11 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block01create/StateCycle01.java @@ -0,0 +1,49 @@ +package com.multy.thread.block01create; + +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; + +/** + * 线程状态和周期 + */ +public class StateCycle01 { + public static void main(String[] args) throws Exception { + // 进入初始状态 + StateThread01 stateThread01 = new StateThread01(); + FutureTask task = new FutureTask<>(stateThread01); + Thread thread = new Thread(task,"GetValueThread"); + // 运行状态 + thread.start(); + // 超时等待结果 + String result = task.get(3, TimeUnit.SECONDS) ; + System.out.println("result="+result); + + StateThread02 stateThread02 = new StateThread02() ; + Thread thread1 = new Thread(stateThread02,"WaitThread"); + thread1.start(); + } +} +class StateThread01 implements Callable { + @Override + public String call() throws Exception { + // 超时等待 + Thread.sleep(1000); + return "Hello,Cicada"; + } +} +class StateThread02 implements Runnable { + @Override + public void run() { + synchronized (StateCycle01.class) { + System.out.println("进入线程..."); + try { + // 等待状态,放弃对象锁 + StateCycle01.class.wait(2000); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("线程继续..."); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread01.java new file mode 100644 index 0000000..5bb0fd4 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread01.java @@ -0,0 +1,50 @@ +package com.multy.thread.block02extend; + +import java.util.ArrayList; +import java.util.List; + +public class ExtendThread01 { + public static void main(String[] args) { + List dataList = new ArrayList<>() ; + dataList.add("A"); + dataList.add("B"); + dataList.add("C"); + // 把一个大的集合按照每个子集合的2个元素切割 + List> splitList = splitList(dataList,2); + for (List list:splitList){ + System.out.println(list); + } + // 多线程处理 + for (List childList:splitList){ + ListTask listTask = new ListTask(childList) ; + Thread runThread = new Thread(listTask); + runThread.start(); + } + } + /** + * List 集合切割 + */ + private static List> splitList (List list, int childSize) { + if (list == null || list.size() == 0 || childSize < 1) { + return null; + } + List> result = new ArrayList<>(); + int size = list.size(); + int count = (size + childSize - 1) / childSize ; + for (int i = 0; i < count; i++) { + List subList = list.subList(i * childSize, ((i + 1) * childSize > size ? size : childSize * (i + 1))); + result.add(subList); + } + return result; + } +} +class ListTask implements Runnable { + private List list ; + public ListTask (List list){this.list=list;} + @Override + public void run() { + for (Object object:list){ + System.out.println(Thread.currentThread().getName()+"=="+object); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread02.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread02.java new file mode 100644 index 0000000..c523658 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread02.java @@ -0,0 +1,31 @@ +package com.multy.thread.block02extend; + +public class ExtendThread02 { + public static void main(String[] args) { + StopThread stopThread = new StopThread() ; + stopThread.start(); + // 标记当前线程停止信号,且抛出中断异常,但没有停止 + stopThread.interrupt(); + // 判断当前线程是否已经是终止状态 + System.out.println("1=="+stopThread.isInterrupted()); + // 清除当前线程的终止信号,并判断执行该方法的线程(main)是否中断 + System.out.println("2=="+stopThread.interrupted()); + // 再次判断当前线程状态 + System.out.println("3=="+stopThread.isInterrupted()); + System.out.println("main end ..."); + } +} +class StopThread extends Thread { + @Override + public void run() { + for (int i = 0 ; i < 10 ; i++){ + try { + System.out.println(Thread.currentThread().getId()+"="+i); + // 线程阻塞1秒 + Thread.sleep(1000); + } catch (InterruptedException e){ + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread03.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread03.java new file mode 100644 index 0000000..4930dee --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread03.java @@ -0,0 +1,30 @@ +package com.multy.thread.block02extend; + +public class ExtendThread03 { + public static void main(String[] args) { + Priority01 priority01 = new Priority01(); + priority01.start(); + System.out.println("priority01="+priority01.getPriority()); + Priority02 priority02 = new Priority02(); + priority02.start(); + System.out.println("priority02="+priority02.getPriority()); + priority01.setPriority(10); + priority02.setPriority(1); + } +} +class Priority01 extends Thread { + @Override + public void run() { + for (int i = 0 ; i < 100 ; i++){ + System.out.println(Thread.currentThread().getName()+";i="+i); + } + } +} +class Priority02 extends Thread { + @Override + public void run() { + for (int a = 0 ; a < 100 ; a++){ + System.out.println(Thread.currentThread().getName()+";a="+a); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread04.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread04.java new file mode 100644 index 0000000..22a1618 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread04.java @@ -0,0 +1,36 @@ +package com.multy.thread.block02extend; + +import java.util.concurrent.TimeUnit; + +public class ExtendThread04 { + public static void main(String[] args) { + JoinThreadA joinThreadA = new JoinThreadA() ; + joinThreadA.start(); + } +} +class JoinThreadA extends Thread { + @Override + public void run() { + System.out.println("缺水中..."); + JoinThreadB joinThreadB = new JoinThreadB() ; + joinThreadB.start(); + try{ + joinThreadB.join(); + } catch (Exception e){ + e.printStackTrace(); + } + System.out.println("喝水中..."); + } +} +class JoinThreadB extends Thread { + @Override + public void run() { + System.out.println("买水中..."); + try{ + TimeUnit.SECONDS.sleep(2); + } catch (Exception e){ + e.printStackTrace(); + } + System.out.println("买到水..."); + } +} diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread05.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread05.java new file mode 100644 index 0000000..7a9df31 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread05.java @@ -0,0 +1,18 @@ +package com.multy.thread.block02extend; + +import java.util.concurrent.TimeUnit; + +public class ExtendThread05 { + private static final ThreadLocal threadLocal = new ThreadLocal<>() ; + private static void initBegin (){ + threadLocal.set(System.currentTimeMillis()); + } + private static Long overTime (){ + return System.currentTimeMillis()-threadLocal.get(); + } + public static void main(String[] args) throws Exception { + ExtendThread05.initBegin(); + TimeUnit.SECONDS.sleep(3); + System.out.println(ExtendThread05.overTime()); + } +} diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread06.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread06.java new file mode 100644 index 0000000..ec058ce --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread06.java @@ -0,0 +1,35 @@ +package com.multy.thread.block02extend; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.concurrent.TimeUnit; + +public class ExtendThread06 { + public static void main(String[] args) throws Exception { + InputStreamReader is = new InputStreamReader(System.in); + BufferedReader br = new BufferedReader(is); + String value = br.readLine(); + CheckThread checkThread = new CheckThread(value) ; + checkThread.setDaemon(true); + checkThread.start(); + } +} +class CheckThread extends Thread { + private String spell ; + public CheckThread (String spell){ + this.spell = spell ; + } + @Override + public void run() { + if (spell.startsWith("cs")){ + System.out.println(spell+":输入正确"); + } else { + System.out.println(spell+":输入错误"); + } + try { + TimeUnit.SECONDS.sleep(10); + } catch (InterruptedException e){ + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread07.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread07.java new file mode 100644 index 0000000..d6fdd1a --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block02extend/ExtendThread07.java @@ -0,0 +1,30 @@ +package com.multy.thread.block02extend; + +public class ExtendThread07 { + public static void main(String[] args) { + TryThread tryThread = new TryThread(); + tryThread.setName("try-name"); + // 定义运行中异常处理策略 + MyExe myExe = new MyExe() ; + tryThread.setUncaughtExceptionHandler(myExe); + tryThread.start(); + } +} +class TryThread extends Thread { + @Override + public void run() { + try { + Thread.sleep(1000); + } catch (InterruptedException e){ + e.printStackTrace(); + } + // 如何处理这里异常? + Integer.parseInt("cicada") ; + } +} +class MyExe implements Thread.UncaughtExceptionHandler { + @Override + public void uncaughtException(Thread t, Throwable e) { + System.out.println(t.getName()+";异常:"+e.getMessage()); + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar01.java new file mode 100644 index 0000000..7e72a6b --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar01.java @@ -0,0 +1,48 @@ +package com.multy.thread.block03access; + +public class AccessVar01 { + public static void main(String[] args) { + Var01Test var01Test = new Var01Test() ; + VarThread01A varThread01A = new VarThread01A(var01Test) ; + varThread01A.start(); + VarThread01B varThread01B = new VarThread01B(var01Test) ; + varThread01B.start(); + } +} +class VarThread01A extends Thread { + Var01Test var01Test = new Var01Test() ; + public VarThread01A (Var01Test var01Test){ + this.var01Test = var01Test ; + } + @Override + public void run() { + var01Test.addNum(50); + } +} +class VarThread01B extends Thread { + Var01Test var01Test = new Var01Test() ; + public VarThread01B (Var01Test var01Test){ + this.var01Test = var01Test ; + } + @Override + public void run() { + var01Test.addNum(10); + } +} +class Var01Test { + private Integer num = 0 ; + public synchronized void addNum (Integer var){ + // Integer num = 0 ; + try { + if (var == 50){ + num = num + 50 ; + Thread.sleep(3000); + } else { + num = num + var ; + } + System.out.println("var="+var+";num="+num); + } catch (Exception e){ + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar02.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar02.java new file mode 100644 index 0000000..369123c --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar02.java @@ -0,0 +1,49 @@ +package com.multy.thread.block03access; + +public class AccessVar02 { + public static void main(String[] args) { + Var02Test var02Test = new Var02Test (); + VarThread02A varThread02A = new VarThread02A(var02Test) ; + varThread02A.start(); + VarThread02B varThread02B = new VarThread02B(var02Test) ; + varThread02B.start(); + var02Test.readValue(); + } +} +class VarThread02A extends Thread { + Var02Test var02Test = new Var02Test (); + public VarThread02A (Var02Test var02Test){ + this.var02Test = var02Test ; + } + @Override + public void run() { + var02Test.change("my","name"); + } +} +class VarThread02B extends Thread { + Var02Test var02Test = new Var02Test (); + public VarThread02B (Var02Test var02Test){ + this.var02Test = var02Test ; + } + @Override + public void run() { + var02Test.change("you","age"); + } +} +class Var02Test { + public String key = "cicada" ; + public String value = "smile" ; + public synchronized void change (String key,String value){ + try { + this.key = key ; + Thread.sleep(2000); + this.value = value ; + System.out.println("key="+key+";value="+value); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + public synchronized void readValue (){ + System.out.println("读取:key="+key+";value="+value); + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar03.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar03.java new file mode 100644 index 0000000..eca3f96 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar03.java @@ -0,0 +1,31 @@ +package com.multy.thread.block03access; + +public class AccessVar03 { + public static void main(String[] args) { + Var03Test var03Test1 = new Var03Test() ; + Thread thread1 = new Thread(var03Test1) ; + thread1.start(); + Thread thread2 = new Thread(var03Test1) ; + thread2.start(); + Thread thread3 = new Thread(var03Test1) ; + thread3.start(); + } +} +class Var03Test implements Runnable { + private Integer count = 0 ; + public void countAdd() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + synchronized(this) { + count++ ; + System.out.println("count="+count); + } + } + @Override + public void run() { + countAdd() ; + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar04.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar04.java new file mode 100644 index 0000000..0dbb2c4 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar04.java @@ -0,0 +1,25 @@ +package com.multy.thread.block03access; + +public class AccessVar04 { + public static void main(String[] args) { + Var04Test var04Test1 = new Var04Test() ; + Thread thread1 = new Thread(var04Test1) ; + thread1.start(); + Var04Test var04Test2 = new Var04Test() ; + Thread thread2 = new Thread(var04Test2) ; + thread2.start(); + } +} +class Var04Test implements Runnable { + private static Integer count ; + public Var04Test (){ + count = 0 ; + } + public synchronized static void countAdd() { + System.out.println(Thread.currentThread().getName()+";count="+(count++)); + } + @Override + public void run() { + countAdd() ; + } +} diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar05.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar05.java new file mode 100644 index 0000000..49521e1 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block03access/AccessVar05.java @@ -0,0 +1,20 @@ +package com.multy.thread.block03access; + +public class AccessVar05 { +} +class Var05Test { + private volatile boolean myFlag = true ; + public void setFlag (boolean myFlag){ + this.myFlag = myFlag ; + } + public void method() { + while (myFlag){ + try { + System.out.println(Thread.currentThread().getName()+myFlag); + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread01.java new file mode 100644 index 0000000..301dd4d --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread01.java @@ -0,0 +1,49 @@ +package com.multy.thread.block04notify; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class NotifyThread01 { + + static Object lock = new Object() ; + static volatile List dataList = new ArrayList<>(); + + public static void main(String[] args) throws Exception { + Thread saveThread = new Thread(new SaveData(),"SaveData"); + saveThread.start(); + TimeUnit.SECONDS.sleep(3); + Thread dataThread = new Thread(new AnalyData(),"AnalyData"); + dataThread.start(); + } + + // 等待数据生成,保存 + static class SaveData implements Runnable { + @Override + public void run() { + synchronized (lock){ + while (dataList.size()==0){ + try { + System.out.println(Thread.currentThread().getName()+"等待..."); + lock.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("SaveData .."+ dataList.get(0)+dataList.get(1)); + } + } + } + // 生成数据,通知保存 + static class AnalyData implements Runnable { + @Override + public void run() { + synchronized (lock){ + dataList.add("hello,"); + dataList.add("java"); + lock.notify(); + System.out.println("AnalyData End..."); + } + } + } +} diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread02.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread02.java new file mode 100644 index 0000000..ee76035 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread02.java @@ -0,0 +1,42 @@ +package com.multy.thread.block04notify; + +import java.io.*; + +public class NotifyThread02 { + public static void main(String[] args) throws Exception { + PipedInputStream pis = new PipedInputStream(); + PipedOutputStream pos = new PipedOutputStream(); + // 链接输入流和输出流 + pos.connect(pis); + // 写数据线程 + new Thread(new Runnable() { + public void run() { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + // 将从键盘读取的数据写入管道流 + PrintStream ps = new PrintStream(pos); + while (true) { + try { + System.out.print(Thread.currentThread().getName()); + ps.println(br.readLine()); + Thread.sleep(1000); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }, "输入数据线程:").start(); + // 读数据线程 + new Thread(new Runnable() { + public void run() { + BufferedReader br = new BufferedReader(new InputStreamReader(pis)); + while (true) { + try { + System.out.println(Thread.currentThread().getName() + br.readLine()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }, "输出数据线程:").start(); + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread03.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread03.java new file mode 100644 index 0000000..eb51505 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block04notify/NotifyThread03.java @@ -0,0 +1,79 @@ +package com.multy.thread.block04notify; + +public class NotifyThread03 { + public static void main(String[] args) { + Product product = new Product(); + ProductFactory productFactory = new ProductFactory(product); + ProductShop productShop = new ProductShop(product); + productFactory.start(); + productShop.start(); + } +} +// 产品 +class Product { + public String name ; + public double price ; + // 产品是否生产完毕,默认没有 + boolean flag ; +} +// 产品工厂:生产 +class ProductFactory extends Thread { + Product product ; + public ProductFactory (Product product){ + this.product = product; + } + @Override + public void run() { + int i = 0 ; + while (i < 20) { + synchronized (product) { + if (!product.flag){ + if (i%2 == 0){ + product.name = "鼠标"; + product.price = 79.99; + } else { + product.name = "键盘"; + product.price = 89.99; + } + System.out.println("产品:"+product.name+"【价格:"+product.price+"】出厂..."); + product.flag = true ; + i++; + // 通知消费者 + product.notifyAll(); + } else { + try { + // 进入等待状态 + product.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + } +} +// 产品商店:销售 +class ProductShop extends Thread { + Product product ; + public ProductShop (Product product){ + this.product = product ; + } + @Override + public void run() { + while (true) { + synchronized (product) { + if (product.flag == true ){ + System.out.println("产品:"+product.name+"【价格"+(product.price*2)+"】卖出..."); + product.flag = false ; + product.notifyAll(); //唤醒生产者 + } else { + try { + product.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block05lock01/LockThread01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block05lock01/LockThread01.java new file mode 100644 index 0000000..5a4e4a0 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block05lock01/LockThread01.java @@ -0,0 +1,47 @@ +package com.multy.thread.block05lock01; + +public class LockThread01 { + public static void main(String[] args) { + CountAdd countAdd = new CountAdd() ; + AddThread01 addThread01 = new AddThread01(countAdd) ; + addThread01.start(); + AddThread02 varThread02 = new AddThread02(countAdd) ; + varThread02.start(); + } +} +class AddThread01 extends Thread { + private CountAdd countAdd ; + public AddThread01 (CountAdd countAdd){ + this.countAdd = countAdd ; + } + @Override + public void run() { + countAdd.countAdd(30); + } +} +class AddThread02 extends Thread { + private CountAdd countAdd ; + public AddThread02 (CountAdd countAdd){ + this.countAdd = countAdd ; + } + @Override + public void run() { + countAdd.countAdd(10); + } +} +class CountAdd { + private Integer count = 0 ; + public void countAdd (Integer num){ + try { + if (num == 30){ + count = count + 50 ; + Thread.sleep(3000); + } else { + count = count + num ; + } + System.out.println("num="+num+";count="+count); + } catch (Exception e){ + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block05lock01/LockThread02.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block05lock01/LockThread02.java new file mode 100644 index 0000000..0d0770f --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block05lock01/LockThread02.java @@ -0,0 +1,40 @@ +package com.multy.thread.block05lock01; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class LockThread02 { + public static void main(String[] args) { + LockNum lockNum = new LockNum() ; + LockThread lockThread1 = new LockThread(lockNum,"TH1"); + LockThread lockThread2 = new LockThread(lockNum,"TH2"); + LockThread lockThread3 = new LockThread(lockNum,"TH3"); + lockThread1.start(); + lockThread2.start(); + lockThread3.start(); + } +} +class LockNum { + private Lock lock = new ReentrantLock() ; + public void getNum (){ + lock.lock(); + try { + for (int i = 0 ; i < 3 ; i++){ + System.out.println("ThreadName:"+Thread.currentThread().getName()+";i="+i); + } + } finally { + lock.unlock(); + } + } +} +class LockThread extends Thread { + private LockNum lockNum ; + public LockThread (LockNum lockNum,String name){ + this.lockNum = lockNum ; + super.setName(name); + } + @Override + public void run() { + lockNum.getNum(); + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI01.java new file mode 100644 index 0000000..45cf11f --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI01.java @@ -0,0 +1,73 @@ +package com.multy.thread.block06lock02; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class LockAPI01 { + + private static Lock lock = new ReentrantLock() ; + private static Condition condition1 = lock.newCondition() ; + private static Condition condition2 = lock.newCondition() ; + + public static void main(String[] args) throws Exception { + List dataList = new ArrayList<>() ; + ReadList readList = new ReadList(dataList); + WriteList writeList = new WriteList(dataList); + new Thread(readList).start(); + TimeUnit.SECONDS.sleep(2); + new Thread(writeList).start(); + } + // 读数据线程 + static class ReadList implements Runnable { + private List dataList ; + public ReadList (List dataList){ + this.dataList = dataList ; + } + @Override + public void run() { + lock.lock(); + try { + if (dataList.size() != 2){ + System.out.println("Read wait..."); + condition1.await(); + } + System.out.println("ReadList WakeUp..."); + for (String element:dataList){ + System.out.println("ReadList:"+element); + } + condition2.signalAll(); + } catch (InterruptedException e){ + e.fillInStackTrace() ; + } finally { + lock.unlock(); + } + } + } + // 写数据线程 + static class WriteList implements Runnable { + private List dataList ; + public WriteList (List dataList){ + this.dataList = dataList ; + } + @Override + public void run() { + lock.lock(); + try { + dataList.add("Java") ; + dataList.add("C++") ; + condition1.signalAll(); + System.out.println("Write over..."); + condition2.await(); + System.out.println("Write WakeUp..."); + } catch (InterruptedException e){ + e.fillInStackTrace() ; + } finally { + lock.unlock(); + } + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI02.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI02.java new file mode 100644 index 0000000..f9cacc8 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI02.java @@ -0,0 +1,100 @@ +package com.multy.thread.block06lock02; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +public class LockAPI02 { + public static void main(String[] args) { + PrintInfo printInfo = new PrintInfo() ; + ExecutorService service = Executors.newFixedThreadPool(3); + service.execute(new PrintA(printInfo)); + service.execute(new PrintB(printInfo)); + service.execute(new PrintC(printInfo)); + } +} +class PrintA implements Runnable { + private PrintInfo printInfo ; + public PrintA (PrintInfo printInfo){ + this.printInfo = printInfo ; + } + @Override + public void run() { + printInfo.printA (); + } +} +class PrintB implements Runnable { + private PrintInfo printInfo ; + public PrintB (PrintInfo printInfo){ + this.printInfo = printInfo ; + } + @Override + public void run() { + printInfo.printB (); + } +} +class PrintC implements Runnable { + private PrintInfo printInfo ; + public PrintC (PrintInfo printInfo){ + this.printInfo = printInfo ; + } + @Override + public void run() { + printInfo.printC (); + } +} +class PrintInfo { + // 控制下个执行的线程 + private String info = "A"; + private ReentrantLock lock = new ReentrantLock(); + // 三个线程,三个控制条件 + Condition conditionA = lock.newCondition(); + Condition conditionB = lock.newCondition(); + Condition conditionC = lock.newCondition(); + public void printA (){ + try { + lock.lock(); + while (!info.equals("A")) { + conditionA.await(); + } + System.out.print("A"); + info = "B"; + conditionB.signalAll(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + lock.unlock(); + } + } + public void printB (){ + try { + lock.lock(); + while (!info.equals("B")) { + conditionB.await(); + } + System.out.print("B"); + info = "C"; + conditionC.signalAll(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + lock.unlock(); + } + } + public void printC (){ + try { + lock.lock(); + while (!info.equals("C")) { + conditionC.await(); + } + System.out.print("C"); + info = "A"; + conditionA.signalAll(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + lock.unlock(); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI03.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI03.java new file mode 100644 index 0000000..0992a17 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI03.java @@ -0,0 +1,67 @@ +package com.multy.thread.block06lock02; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class LockAPI03 { + public static void main(String[] args) throws Exception { + DataMap dataMap = new DataMap() ; + Thread read = new Thread(new GetRun(dataMap)) ; + Thread write = new Thread(new PutRun(dataMap)) ; + write.start(); + Thread.sleep(2000); + read.start(); + } +} +class GetRun implements Runnable { + private DataMap dataMap ; + public GetRun (DataMap dataMap){ + this.dataMap = dataMap ; + } + @Override + public void run() { + System.out.println("GetRun:"+dataMap.get("myKey")); + } +} +class PutRun implements Runnable { + private DataMap dataMap ; + public PutRun (DataMap dataMap){ + this.dataMap = dataMap ; + } + @Override + public void run() { + dataMap.put("myKey","myValue"); + } +} +class DataMap { + Map dataMap = new HashMap<>() ; + ReadWriteLock rwLock = new ReentrantReadWriteLock() ; + Lock readLock = rwLock.readLock() ; + Lock writeLock = rwLock.writeLock() ; + + // 读取数据 + public String get (String key){ + readLock.lock(); + try{ + return dataMap.get(key) ; + } finally { + readLock.unlock(); + } + } + // 写入数据 + public void put (String key,String value){ + writeLock.lock(); + try{ + dataMap.put(key,value) ; + System.out.println("执行写入结束..."); + Thread.sleep(10000); + } catch (Exception e) { + System.out.println("Exception..."); + } finally { + writeLock.unlock(); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI04.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI04.java new file mode 100644 index 0000000..8cb2888 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block06lock02/LockAPI04.java @@ -0,0 +1,33 @@ +package com.multy.thread.block06lock02; + +import java.util.concurrent.locks.LockSupport; + +public class LockAPI04 { + public static void main(String[] args) throws Exception { + OrderPay orderPay = new OrderPay("UnPaid") ; + Thread orderThread = new Thread(orderPay) ; + orderThread.start(); + Thread.sleep(3000); + orderPay.changeState("Pay"); + LockSupport.unpark(orderThread); + } +} +class OrderPay implements Runnable { + // 支付状态 + private String orderState ; + public OrderPay (String orderState){ + this.orderState = orderState ; + } + public synchronized void changeState (String orderState){ + this.orderState = orderState ; + } + @Override + public void run() { + if (orderState.equals("UnPaid")){ + System.out.println("订单待支付..."+orderState); + LockSupport.park(orderState); + } + System.out.println("orderState="+orderState); + System.out.println("订单准备发货..."); + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block07forkjoin/ForkJoin01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block07forkjoin/ForkJoin01.java new file mode 100644 index 0000000..7826a06 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block07forkjoin/ForkJoin01.java @@ -0,0 +1,65 @@ +package com.multy.thread.block07forkjoin; + +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.RecursiveTask; + +public class ForkJoin01 { + + public static void main (String[] args) { + int[] numArr = new int[100]; + for (int i = 0; i < 100; i++) { + numArr[i] = i + 1; + } + ForkJoinPool pool = new ForkJoinPool(); + ForkJoinTask forkJoinTask = + pool.submit(new SumTask(numArr, 0, numArr.length)); + System.out.println("合并计算结果: " + forkJoinTask.invoke()); + pool.shutdown(); + } +} +/** + * 线程任务 + */ +class SumTask extends RecursiveTask { + /* + * 切分任务块的阈值 + * 如果THRESHOLD=100 + * 输出:main【求和:(0...100)=5050】 合并计算结果: 5050 + */ + private static final int THRESHOLD = 100; + private int arr[]; + private int start; + private int over; + + public SumTask(int[] arr, int start, int over) { + this.arr = arr; + this.start = start; + this.over = over; + } + + // 求和计算 + private Integer sumCalculate () { + Integer sum = 0; + for (int i = start; i < over; i++) { + sum += arr[i]; + } + String task = "【求和:(" + start + "..." + over + ")=" + sum +"】"; + System.out.println(Thread.currentThread().getName() + task); + return sum ; + } + + @Override + protected Integer compute() { + if ((over - start) <= THRESHOLD) { + return sumCalculate(); + }else { + int middle = (start + over) / 2; + SumTask left = new SumTask(arr, start, middle); + SumTask right = new SumTask(arr, middle, over); + left.fork(); + right.fork(); + return left.join() + right.join(); + } + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block08executor/Executor01.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block08executor/Executor01.java new file mode 100644 index 0000000..2102985 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block08executor/Executor01.java @@ -0,0 +1,47 @@ +package com.multy.thread.block08executor; +import java.util.concurrent.*; + +public class Executor01 { + // 定义线程池 + private static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor( + 3,10,5000,TimeUnit.SECONDS, + new SynchronousQueue<>(),Executors.defaultThreadFactory(),new ExeHandler()); + public static void main(String[] args) { + for (int i = 0 ; i < 100 ; i++){ + poolExecutor.execute(new PoolTask(i)); + //带返回值:poolExecutor.submit(new PoolTask(i)); + } + } +} +// 定义线程池任务 +class PoolTask implements Runnable { + + private int numParam; + + public PoolTask (int numParam) { + this.numParam = numParam; + } + @Override + public void run() { + try { + System.out.println("PoolTask "+ numParam+" begin..."); + Thread.sleep(5000); + } catch (Exception e) { + e.printStackTrace(); + } + } + public int getNumParam() { + return numParam; + } + public void setNumParam(int numParam) { + this.numParam = numParam; + } +} +// 定义异常处理 +class ExeHandler implements RejectedExecutionHandler { + @Override + public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor) { + System.out.println("ExeHandler "+executor.getCorePoolSize()); + executor.shutdown(); + } +} \ No newline at end of file diff --git a/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block08executor/Executor02.java b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block08executor/Executor02.java new file mode 100644 index 0000000..78b45c2 --- /dev/null +++ b/java-se-base-parent/model-multy-thread/src/main/java/com/multy/thread/block08executor/Executor02.java @@ -0,0 +1,65 @@ +package com.multy.thread.block08executor; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class Executor02 { + + public static void main(String[] args) { + // 初始化校验任务 + List checkTaskList = new ArrayList<>() ; + initList(checkTaskList); + // 定义线程池 + ExecutorService executorService ; + if (checkTaskList.size() < 10){ + executorService = Executors.newFixedThreadPool(checkTaskList.size()); + }else{ + executorService = Executors.newFixedThreadPool(10); + } + // 批量处理 + List> results = new ArrayList<>() ; + try { + results = executorService.invokeAll(checkTaskList); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + // 查看结果 + for (Future result : results){ + try { + System.out.println(result.get()); + // System.out.println(result.get(10000,TimeUnit.SECONDS)); + } catch (Exception e) { + e.printStackTrace() ; + } + } + // 关闭线程池 + executorService.shutdownNow(); + } + + private static void initList (List checkTaskList){ + checkTaskList.add(new CheckTask("root","123")) ; + checkTaskList.add(new CheckTask("root1","1234")) ; + checkTaskList.add(new CheckTask("root2","1235")) ; + } +} +// 校验任务 +class CheckTask implements Callable { + private String userName ; + private String passWord ; + public CheckTask(String userName, String passWord) { + this.userName = userName; + this.passWord = passWord; + } + @Override + public Boolean call() throws Exception { + // 校验账户+密码 + if (userName.equals("root") && passWord.equals("123")){ + return Boolean.TRUE ; + } + return Boolean.FALSE ; + } +} \ No newline at end of file diff --git a/java-se-base-parent/pom.xml b/java-se-base-parent/pom.xml index a3f9feb..b9ae561 100644 --- a/java-se-base-parent/pom.xml +++ b/java-se-base-parent/pom.xml @@ -12,5 +12,12 @@ java-se-base-parent pom + + + model-data-type + + model-multy-thread + + \ No newline at end of file