first commit

This commit is contained in:
Jason Lu 2025-02-11 23:07:10 +08:00
commit 3c709917e1
12 changed files with 269 additions and 0 deletions

29
.gitignore vendored Normal file
View File

@ -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

3
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

6
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/java_test.iml" filepath="$PROJECT_DIR$/java_test.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

11
java_test.iml Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

5
src/Main.java Normal file
View File

@ -0,0 +1,5 @@
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

21
src/MultiThreadDemo.java Normal file
View File

@ -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()
);
}
}
}

32
src/ProcessDemo.java Normal file
View File

@ -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);
}
}
}

42
src/ThreadLocalDemo.java Normal file
View File

@ -0,0 +1,42 @@
public class ThreadLocalDemo {
public ThreadLocal<Integer> 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);
}
}
}

View File

@ -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<Integer> 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);
}
}
}

View File

@ -0,0 +1,40 @@
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
Object obj = new Object();
//创建一个弱引用指向该对象
WeakReference<Object> 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.");
}
}
}