commit 3c709917e14799bdce3dc38be88646c8519b9acc Author: Jason Lu Date: Tue Feb 11 23:07:10 2025 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..6f29fee --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..02c13c5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/java_test.iml b/java_test.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/java_test.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..d5238c9 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,5 @@ +public class Main { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} \ No newline at end of file diff --git a/src/MultiThreadDemo.java b/src/MultiThreadDemo.java new file mode 100644 index 0000000..c222e7b --- /dev/null +++ b/src/MultiThreadDemo.java @@ -0,0 +1,21 @@ +import java.lang.management.ThreadInfo; +import java.lang.management.ThreadMXBean; + +public class MultiThreadDemo { + + public static void main(String[] args) { + ThreadMXBean threadMXBean = java.lang.management.ManagementFactory.getThreadMXBean(); + + // 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息 + ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false); + // 遍历线程信息,仅打印线程 ID 和线程名称信息 + for (ThreadInfo threadInfo : threadInfos) { + + System.out.println("[" + threadInfo.getThreadId() + "] " + + threadInfo.getThreadName() + + "; Thread state: " + threadInfo.getThreadState() + + " ; Is daemon: " + threadInfo.isDaemon() + ); + } + } +} diff --git a/src/ProcessDemo.java b/src/ProcessDemo.java new file mode 100644 index 0000000..0739b54 --- /dev/null +++ b/src/ProcessDemo.java @@ -0,0 +1,32 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class ProcessDemo { + + public static void main(String[] args) { + try { + Process p = Runtime.getRuntime().exec(new String[]{"ls","-l", "/home/admin"}); + + // 读取标准输出 + BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + while ((line = stdInput.readLine()) != null) { + System.out.println("标准输出: " + line); + } + + // 读取错误输出 + BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); + while ((line = stdError.readLine()) != null) { + System.out.println("错误输出: " + line); + } + + // 等待进程结束 + int exitCode = p.waitFor(); + + System.out.println("进程结束,退出码: " + exitCode); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/ThreadLocalDemo.java b/src/ThreadLocalDemo.java new file mode 100644 index 0000000..a8221dd --- /dev/null +++ b/src/ThreadLocalDemo.java @@ -0,0 +1,42 @@ +public class ThreadLocalDemo { + + public ThreadLocal localVar = new ThreadLocal<>(); + private Integer integer = 0; + + public void add() { + integer = integer + 1; + } + + public int get() { + return integer; + } + + public static void main(String[] args) { + ThreadLocalDemo threadLocalDemo = new ThreadLocalDemo(); + + threadLocalDemo.localVar.set(threadLocalDemo.integer); + + Thread t1 = new Thread(threadLocalDemo::add, "t1"); + + Thread t2 = new Thread( () -> { + threadLocalDemo.add(); + threadLocalDemo.localVar.set(threadLocalDemo.get()); + System.out.println("value in new thread: " + threadLocalDemo.get()); + System.out.println("value in new thread localVar: " + threadLocalDemo.localVar.get()); + }, "t2"); + + t1.start(); + t2.start(); + + try { + t1.join(); + System.out.println("value in main thread: " + threadLocalDemo.get()); + System.out.println("value in main thread localVar: " + threadLocalDemo.localVar.get()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + + +} diff --git a/src/ThreadShareVariable.java b/src/ThreadShareVariable.java new file mode 100644 index 0000000..8d39aef --- /dev/null +++ b/src/ThreadShareVariable.java @@ -0,0 +1,66 @@ +import java.util.stream.DoubleStream; + +/** + * 类ThreadShareVariable演示了线程间共享变量的使用和潜在风险 + */ +public class ThreadShareVariable { + + /** + * 共享变量i,多个线程会访问和修改这个变量 + */ + public Integer i = 0; + + /** + * 设置共享变量i的值 + * + * @param i 新的变量值 + */ + public void setI(int i) { + this.i = i; + } + + /** + * 获取共享变量i的值 + * + * @return 当前的变量值 + */ + public int getI() { + return i; + } + + /** + * 主函数演示了如何在多线程环境下使用共享变量,并展示了线程局部变量的用法 + * + * @param args 命令行参数 + */ + public static void main(String[] args) { + ThreadShareVariable threadShareVariable = new ThreadShareVariable(); + + // 使用ThreadLocal以线程为单位隔离变量i的值,避免共享变量的并发问题 + ThreadLocal threadLocal = ThreadLocal.withInitial(threadShareVariable::getI); + + // 新建一个线程,该线程会修改共享变量i的值 + Thread thread = new Thread(() -> { + threadShareVariable.setI(1); + }); + + // 新建一个线程,该线程会打印共享变量i的值 + new Thread(() -> { + System.out.println("print i in new thread: " + threadShareVariable.getI()); + + }).start(); + + thread.start(); + try { + // 等待线程thread执行完毕 + thread.join(); + // 打印共享变量i的值,预期为1 + System.out.println(threadShareVariable.getI()); + // 打印ThreadLocal中的值,此处的值是最原始的共享变量值0 + System.out.println("value in ThreadLocal: " + threadLocal.get()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + } +} diff --git a/src/WeakReferenceExample.java b/src/WeakReferenceExample.java new file mode 100644 index 0000000..ca3421a --- /dev/null +++ b/src/WeakReferenceExample.java @@ -0,0 +1,40 @@ +import java.lang.ref.WeakReference; + +public class WeakReferenceExample { + + public static void main(String[] args) { + Object obj = new Object(); + + //创建一个弱引用,指向该对象 + WeakReference weakRef = new WeakReference<>(obj); + + //手动调用垃圾回收 + System.gc(); + + //检查弱引用是否被回收 + if (weakRef.get() == null) { + System.out.println("Weak reference has been collected."); + } else { + System.out.println("Weak reference still exists."); + } + + //清除强引用 + obj = null; + + if (weakRef.get() == null) { + System.out.println("Weak reference has been collected."); + } else { + System.out.println("Weak reference still exists."); + } + + //再次手动调用垃圾回收 + System.gc(); + + //再次检查弱引用是否被回收 + if (weakRef.get() == null) { + System.out.println("Weak reference has been collected."); + } else { + System.out.println("Weak reference still exists."); + } + } +}