提交 1f5b93b8 编写于 作者: 雷学委's avatar 雷学委

checkin multi-threading demo code

上级 1e7b8a77
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>org.levintech.javademo</groupId>
<artifactId>leixuewei-multithread</artifactId>
<version>1.0-SNAPSHOT</version>
<name>leixuewei-multithread</name>
<description>雷学委 CSDN/Juejin/知乎/博客/Bilibili demo</description>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
package org.levintech.javademo.leixuewei.multiplethreading;
/**
* Demo一个简单的Worker线程
* 文章:趣味故事掌握多线程基础 - 揭秘大型鞋厂百万并发产能内幕【多图建议收藏】
* https://blog.csdn.net/geeklevin
*
* @author levin
* Created on 2021/6/19
* [雷学委] CSDN/Juejin Code Demo
*/
public class LeiXueWeiRunner {
public static void main(String[] args) throws InterruptedException {
System.out.println("【雷学委代码Demo】");
SimpleWorker leiXiaoHua = new SimpleWorker("雷小花", 57);
println(leiXiaoHua);
leiXiaoHua.start();
println(leiXiaoHua);
Thread.sleep(3000);
println(leiXiaoHua);
}
public static void println(SimpleWorker worker) {
System.out.println("【雷学委代码Demo】工人:" + worker);
}
}
package org.levintech.javademo.leixuewei.multiplethreading;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
/**
* @author levin
* Created on 2021/6/19
* [雷学委] CSDN/Juejin Code Demo
*/
public class LeiXueWeiRunner01 {
public static void main(String[] args) {
System.out.println("【雷学委代码Demo】");
LinkedBlockingQueue<Integer> workItems = generateWorkItems(10);//生成10双鞋子
ConcurrentHashMap<String, List<Integer>> status = new ConcurrentHashMap<>();
Worker leiXiaoHua = new Worker("雷小花", 57, workItems, status);
println(leiXiaoHua);
leiXiaoHua.start();
println(leiXiaoHua);
}
public static void println(SimpleWorker worker) {
System.out.println("【雷学委代码Demo】工人:" + worker);
}
public static LinkedBlockingQueue<Integer> generateWorkItems(int totalCount) {
LinkedBlockingQueue<Integer> workItems = new LinkedBlockingQueue<>();
for (int i = 1; i <= totalCount; i++) {
workItems.add(i);
}
return workItems;
}
public static void doAndPrintWorkItem(LinkedBlockingQueue<Integer> workItems) {
while (!workItems.isEmpty()) {
System.out.println(workItems.poll());
}
}
}
package org.levintech.javademo.leixuewei.multiplethreading;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import static org.levintech.javademo.leixuewei.multiplethreading.LeiXueWeiRunner01.generateWorkItems;
/**
* 展示百万订单规模鞋子被100个工人正确处理完
* * CSDN文章:趣味故事掌握多线程基础 - 揭秘大型鞋厂百万并发产能内幕【多图建议收藏】
*
* @author levin
* Created on 2021/6/19
* [雷学委] CSDN/Juejin Code Demo
*/
public class LeiXueWeiRunner02 {
public static void main(String[] args) throws InterruptedException {
System.out.println("【雷学委代码Demo】");
final int totalCount = 1000000;
LinkedBlockingQueue<Integer> workItems = generateWorkItems(totalCount);//生成100万双鞋子
ConcurrentHashMap<String, List<Integer>> status = new ConcurrentHashMap<>();
//doAndPrintWorkItem(workItems);
for (int i = 0; i < 100; i++) {//请100工人包装(22天*8小时*57双
Worker leiXiaoHua = new Worker("雷小花" + (i + 1), 22 * 8 * 57, workItems, status);
leiXiaoHua.start();//at the same time, 100 woker do packaging
}
while (!workItems.isEmpty()) {//等待suoyou1所有gongzuo1og工作
System.out.println("工人在忙工作,不要催,请耐心等待!....剩余:" + workItems.size());
Thread.sleep(3 * 1000);
}
int actualTotalCount = 0;
for (Map.Entry<String, List<Integer>> entry : status.entrySet()) {
actualTotalCount += entry.getValue().size();
}
System.out.println("totalCount=" + actualTotalCount);//百万订单处理完成!
}
}
package org.levintech.javademo.leixuewei.multiplethreading;
/**
* 一个简单打工人线程
*
* @author levin
* Created on 2021/7/10
* [雷学委] CSDN/Juejin Code Demo
*/
public class SimpleWorker extends Thread {
private String workerName;
private Integer batchSize;
public SimpleWorker(String workerName, Integer batchSize) {
this.workerName = workerName;
this.batchSize = batchSize;
}
@Override
public String toString() {
return "SimpleWorker{" +
"workerName='" + workerName +
",batchSize='" + batchSize +
",state='" + super.getState() +
'}';
}
@Override
public void run() {
System.out.println("【雷学委代码Demo】工人" + toString());
}
public String getWorkerName() {
return workerName;
}
public Integer getBatchSize() {
return batchSize;
}
}
package org.levintech.javademo.leixuewei.multiplethreading;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
/**
* 一个"高级"打工人线程
*
* @author levin
* Created on 2021/7/10
* [雷学委] CSDN/Juejin Code Demo
*/
public class Worker extends SimpleWorker {
private LinkedBlockingQueue<Integer> workItems;
private ConcurrentHashMap<String, List<Integer>> status;
public Worker(String workerName, Integer batchSize, LinkedBlockingQueue<Integer> workItems, ConcurrentHashMap<String, List<Integer>> status) {
super(workerName, batchSize);
this.workItems = workItems;
this.status = status;
}
@Override
public String toString() {
return "Worker{" +
"workerName='" + super.getWorkerName() +
",batchSize='" + super.getBatchSize() +
",thread=" + super.getName() +
",threadId=" + super.getId() +
",threadPriority=" + super.getPriority() +
",threadState=" + super.getState() +
",threadGroup=" + super.getThreadGroup() +
",threadUncaughtExceptionHandler=" + super.getUncaughtExceptionHandler() +
'}';
}
@Override
public void run() {
System.out.println("【雷学委代码Demo】工人" + toString());
int handledNum = 0;
List<Integer> items = new ArrayList<>();
while (handledNum < this.getBatchSize() && !workItems.isEmpty()) {
int shoeId = workItems.poll();
System.out.println("【雷学委代码Demo】" + this.getWorkerName() + " 包装了鞋子,序号=" + shoeId);
handledNum++;
items.add(shoeId);
}
status.put(this.getWorkerName(), items);
}
}
package org.levintech.javademo.leixuewei.multiplethreading;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Unit test for simple App.
*/
public class AppTest
{
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue()
{
assertTrue( true );
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册