feat: JMHExample01

This commit is contained in:
Bunny 2025-01-19 12:08:45 +08:00
parent e90294d7d6
commit 823db4204d
31 changed files with 295 additions and 4 deletions

View File

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/multithreading1/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/multithreading1/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/multithreading1/src/main/resources-filtered" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/multithreading_init/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/multithreading_init/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/multithreading_init/src/main/resources-filtered" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources-filtered" charset="UTF-8" />

28
multithreading1/pom.xml Normal file
View File

@ -0,0 +1,28 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.bunny</groupId>
<artifactId>MultiThread</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>multithreading1</artifactId>
<packaging>jar</packaging>
<name>multithreading1</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,53 @@
package cn.bunny;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
// Benchmark Mode Cnt Score Error Units
// JMHExample01.arrayListAdd avgt 10 0.085 ± 0.364 us/op
// JMHExample01.linkedListAdd avgt 10 0.007 ± 0.001 us/op
@BenchmarkMode({Mode.AverageTime})
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Measurement(iterations = 5)// 度量5个批次
@Warmup(iterations = 3)// 预热3个批次
public class JMHExample01 {
private final static String DATA = "DUMMY DATA";
private List<String> arrayList;
private List<String> linkedList;
public static void main(String[] args) throws RunnerException {
final Options opt = new OptionsBuilder().include(JMHExample01.class.getSimpleName())
.forks(1)
.measurementIterations(10)// 度量执行的批次为10在这个5个批次中对基准方法执行与调用将会纳入统计
.warmupIterations(10)// 在真正的度量之前首先会对代码进行10个批次的预热是代码运行达到JVM已经优化的效果
.build();
new Runner(opt).run();
}
@Setup(Level.Iteration)
public void setUp() {
this.arrayList = new ArrayList<>();
this.linkedList = new ArrayList<>();
}
@Benchmark
public List<String> arrayListAdd() {
this.arrayList.add(DATA);
return this.arrayList;
}
@Benchmark
public List<String> linkedListAdd() {
this.linkedList.add(DATA);
return this.linkedList;
}
}

View File

@ -0,0 +1,38 @@
package cn.bunny;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public AppTest( String testName )
{
super( testName );
}
/**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( AppTest.class );
}
/**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
}

View File

@ -0,0 +1,23 @@
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.bunny</groupId>
<artifactId>MultiThread</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>multithreading_init</artifactId>
<packaging>jar</packaging>
<name>multithreading_init</name>
<url>https://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
</dependencies>
</project>

View File

@ -0,0 +1,41 @@
package init;
public class DeadlockExample {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (lock1) {
System.out.println("Thread 1: Holding lock 1...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1: Waiting for lock 2...");
synchronized (lock2) {
System.out.println("Thread 1: Holding lock 1 and lock 2...");
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock2) {
System.out.println("Thread 2: Holding lock 2...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 2: Waiting for lock 1...");
synchronized (lock1) {
System.out.println("Thread 2: Holding lock 1 and lock 2...");
}
}
});
thread1.start();
thread2.start();
}
}

View File

@ -0,0 +1,89 @@
package subtitle;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StarTrekWithDiscovery {
// 字幕文件目录
private static final Path SUBTITLE_PATH = Path.of("G:\\媒体\\电视剧\\星际迷航系列\\星际迷航:发现号系列\\字幕");
// 输出文件目录
private static final Path OUTPUT_PATH = Path.of("F:\\学习\\代码\\Java\\完成字幕");
// 匹配字幕中英文正则表达式
private static final Pattern LINE_PATTERN = Pattern.compile("Dialogue: .*,,(?<chinese>.*?)\\\\.*?}(?<english>.*)");
public static void main(String[] args) throws IOException {
// 先删除所有文件
deleteFolder(new File(OUTPUT_PATH.toString()));
// 递归查找需要文件内容
try (Stream<Path> walk = Files.walk(SUBTITLE_PATH)) {
walk.filter(file -> file.getFileName().toString().endsWith("ass"))
.forEach(StarTrekWithDiscovery::processFile);
} catch (IOException e) {
throw new RuntimeException("Error processing files", e);
}
}
/**
* 文件进程
*
* @param file 文件
*/
private static void processFile(Path file) {
// 相对路径
Path relativePath = SUBTITLE_PATH.relativize(file.getParent());
// 输出文件目录
Path outputDir = OUTPUT_PATH.resolve(relativePath);
try (Stream<String> lines = Files.lines(file, StandardCharsets.UTF_8)) {
Files.createDirectories(outputDir);
String content = lines.map(line -> {
// 匹配需要的字幕内容
Matcher matcher = LINE_PATTERN.matcher(line);
if (matcher.find()) {
String chinese = matcher.group("chinese");
String english = matcher.group("english");
return chinese + " " + english;
}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.joining("\n"));
Files.writeString(outputDir.resolve(file.getFileName()), content, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new RuntimeException("Error processing file: " + file, e);
}
}
/**
* 删除文件
*
* @param folder 文件目录
*/
public static void deleteFolder(File folder) {
if (folder.isDirectory()) {
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
deleteFolder(file);
}
}
}
boolean delete = folder.delete();
System.out.println("删除文件" + folder.getName() + "" + (delete ? "成功" : "失败"));
}
}

21
pom.xml
View File

@ -7,12 +7,17 @@
<groupId>cn.bunny</groupId>
<artifactId>MultiThread</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<modules>
<module>multithreading1</module>
<module>multithreading_init</module>
</modules>
<scm>
<connection/>
<developerConnection/>
@ -32,19 +37,27 @@
<artifactId>lombok</artifactId>
<version>1.18.36</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.16</version>
</dependency>
<!-- jmh -->
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.19</version>
</dependency>
</dependencies>
</project>