From 2473b1c944e6721a8c8f12f1e0757dda146c42b7 Mon Sep 17 00:00:00 2001 From: dongzeliang <2746733890@qq.com> Date: Fri, 17 Nov 2023 16:45:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E6=A8=A1=E6=8B=9F?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/muyu/common/ThreadPool.java | 14 +- src/main/java/com/muyu/vehicle/MyThread.java | 37 ------ src/main/java/com/muyu/vehicle/Test.java | 121 ++++++++++++------ .../com/muyu/vehicle/VehicleInstance.java | 105 +++++++++++++++ .../com/muyu/vehicle/core/LocalContainer.java | 29 +++-- .../vehicle/core/VehicleConfiguration.java | 2 +- .../muyu/vehicle/model/VehicleInstance.java | 35 ----- .../muyu/vehicle/thread/VehicleThread.java | 66 ++++++++++ 8 files changed, 280 insertions(+), 129 deletions(-) delete mode 100644 src/main/java/com/muyu/vehicle/MyThread.java create mode 100644 src/main/java/com/muyu/vehicle/VehicleInstance.java delete mode 100644 src/main/java/com/muyu/vehicle/model/VehicleInstance.java create mode 100644 src/main/java/com/muyu/vehicle/thread/VehicleThread.java diff --git a/src/main/java/com/muyu/common/ThreadPool.java b/src/main/java/com/muyu/common/ThreadPool.java index ef15ed1..1603f43 100644 --- a/src/main/java/com/muyu/common/ThreadPool.java +++ b/src/main/java/com/muyu/common/ThreadPool.java @@ -1,9 +1,8 @@ package com.muyu.common; -import com.muyu.vehicle.MyThread; - import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; /** @@ -18,8 +17,15 @@ public class ThreadPool { */ private static final ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1); - public static void submit (Runnable thread){ + public static ScheduledFuture> submit (Runnable thread){ // 参数分别是: 任务, 多久后开始执行, 每隔多久执行一次(周期),时间单位 - scheduledThreadPool.scheduleAtFixedRate(thread, 0,1, TimeUnit.SECONDS); + return scheduledThreadPool.scheduleAtFixedRate(thread, 0, 1, TimeUnit.SECONDS); + } + + /** + * 关闭线程池 + */ + public static void shutdown() { + scheduledThreadPool.shutdown(); } } diff --git a/src/main/java/com/muyu/vehicle/MyThread.java b/src/main/java/com/muyu/vehicle/MyThread.java deleted file mode 100644 index 9a5c6b0..0000000 --- a/src/main/java/com/muyu/vehicle/MyThread.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.muyu.vehicle; - -public class MyThread implements Runnable { - - /** - * 设置是否暂停 - */ - private volatile boolean isPaused; - - @Override - public void run() { - if (!isPaused){ - System.out.println(System.currentTimeMillis()); - }else { - System.out.println("线程暂停"); - } - } - - /** - * 暂停线程 - */ - public void pause() { - isPaused = true; - } - - /** - * 开始线程 - */ - public void resume() { - isPaused = false; - synchronized (this) { - notify(); // 唤醒线程 - } - } - - -} diff --git a/src/main/java/com/muyu/vehicle/Test.java b/src/main/java/com/muyu/vehicle/Test.java index fcd2a94..2eae2da 100644 --- a/src/main/java/com/muyu/vehicle/Test.java +++ b/src/main/java/com/muyu/vehicle/Test.java @@ -1,6 +1,13 @@ package com.muyu.vehicle; import com.muyu.common.ThreadPool; +import com.muyu.domain.Vehicle; +import com.muyu.vehicle.core.LocalContainer; +import com.muyu.vehicle.model.VehicleData; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.concurrent.CountDownLatch; import static java.lang.Thread.sleep; @@ -11,47 +18,85 @@ import static java.lang.Thread.sleep; */ public class Test { + public static CountDownLatch countDownLatch = new CountDownLatch(2); public static void main(String[] args) throws InterruptedException { + String vin1 = "VIN123456789123456", vin2 = "VIN123456789166666"; + init(vin1); + init(vin2); + new Thread(new TestThread(vin1)).start(); + new Thread(new TestThread(vin2)).start(); + countDownLatch.await(); + ThreadPool.shutdown(); + } - MyThread thread = new MyThread(); - ThreadPool.submit(thread); - new Thread(() -> { - try { - sleep(3000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - thread.pause(); - }).start(); + public static void init(String vin){ + Vehicle vehicle = Vehicle.builder() + .vin(vin) + .createTime(new Date()) + .remainingBattery(new BigDecimal("45000")) + .batteryLevel(new BigDecimal("50000")) + .build(); - /*new Thread(() -> { - try { - sleep(5000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - System.out.println("执行了五秒,等待五秒,在开始"); - try { - synchronized (thread){ - thread.wait(); - } - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - System.out.println("等待了五秒,现在开始,3秒后杀死"); - synchronized (thread){ - thread.notify(); - } - try { - sleep(3000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - synchronized (thread){ - thread.interrupt(); - } - System.out.println("停止成功" + thread.isAlive()); - }).start();*/ + VehicleInstance vehicleInstance = new VehicleInstance(); + vehicleInstance.setVehicle(vehicle); + vehicleInstance.setVehicleData(VehicleData.vehicleBuild(vehicle)); + LocalContainer.setVehicleInstance(vehicleInstance); + } + +} + +class TestThread implements Runnable{ + + private String vin ; + + public TestThread(String vin) { + this.vin = vin; + } + + /** + * When an object implementing interface {@code Runnable} is used + * to create a thread, starting the thread causes the object's + * {@code run} method to be called in that separately executing + * thread. + *
+ * The general contract of the method {@code run} is that it may
+ * take any action whatsoever.
+ *
+ * @see Thread#run()
+ */
+ @Override
+ public void run() {
+ VehicleInstance vehicleIns = LocalContainer.getVehicleInstance(vin);
+ vehicleIns.initVehicleThread();
+ try {
+ sleep(3000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ vehicleIns.startSend();
+
+ try {
+ sleep(3000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ vehicleIns.pauseSend();
+
+ try {
+ sleep(3000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ vehicleIns.startSend();
+
+ try {
+ sleep(3000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ vehicleIns.stopSend();
+
+ Test.countDownLatch.countDown();
}
}
diff --git a/src/main/java/com/muyu/vehicle/VehicleInstance.java b/src/main/java/com/muyu/vehicle/VehicleInstance.java
new file mode 100644
index 0000000..5e4d2b4
--- /dev/null
+++ b/src/main/java/com/muyu/vehicle/VehicleInstance.java
@@ -0,0 +1,105 @@
+package com.muyu.vehicle;
+
+import com.muyu.common.ThreadPool;
+import com.muyu.domain.Vehicle;
+import com.muyu.vehicle.model.VehicleData;
+import com.muyu.vehicle.thread.VehicleThread;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+
+import java.util.concurrent.ScheduledFuture;
+
+import static java.lang.Thread.sleep;
+
+/**
+ * @author DongZeLiang
+ * @version 1.0
+ * @description 车辆实例
+ * @date 2023/11/16
+ */
+@Data
+@Log4j2
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class VehicleInstance {
+
+ /**
+ * 车辆
+ */
+ private Vehicle vehicle;
+
+
+ /**
+ * 实例数据
+ */
+ private VehicleData vehicleData;
+
+
+ /**
+ * 车辆工作线程
+ */
+ private VehicleThread vehicleThread;
+
+ /**
+ * 线程提交回调
+ */
+ private ScheduledFuture> scheduledFuture;
+
+
+ /***
+ * 获取当前车辆VIN
+ * @return VIN
+ */
+ public String getVin(){
+ return this.vehicle.getVin();
+ }
+
+
+ /**
+ * 初始化线程
+ */
+ public void initVehicleThread(){
+ VehicleThread vehicleThread = new VehicleThread();
+ vehicleThread.setVehicleInstance(this);
+ this.setVehicleThread(vehicleThread);
+ this.vehicleThread.pause();
+ ScheduledFuture> scheduledFuture = ThreadPool.submit(vehicleThread);
+ this.setScheduledFuture(scheduledFuture);
+ log.info("初始化车辆上报模拟线程开始:[{}]", this.getVin());
+ }
+
+ /**
+ * 开始上报线程
+ */
+ public void startSend(){
+ this.vehicleThread.resume();
+ }
+
+ /**
+ * 暂停上报线程
+ */
+ public void pauseSend(){
+ this.vehicleThread.pause();
+ }
+
+ /**
+ * 结束发送
+ */
+ public void stopSend(){
+ this.vehicleThread.stop();
+ }
+
+ /**
+ * 取消执行
+ */
+ public void cancelExecution(){
+ scheduledFuture.cancel(true);
+ this.vehicleThread = null;
+ this.scheduledFuture = null;
+ }
+
+}
diff --git a/src/main/java/com/muyu/vehicle/core/LocalContainer.java b/src/main/java/com/muyu/vehicle/core/LocalContainer.java
index 3d73f8b..d52f47a 100644
--- a/src/main/java/com/muyu/vehicle/core/LocalContainer.java
+++ b/src/main/java/com/muyu/vehicle/core/LocalContainer.java
@@ -1,8 +1,6 @@
package com.muyu.vehicle.core;
-import com.muyu.domain.Vehicle;
-import com.muyu.vehicle.model.VehicleData;
-import com.muyu.vehicle.model.VehicleInstance;
+import com.muyu.vehicle.VehicleInstance;
import java.util.HashMap;
import java.util.Map;
@@ -21,19 +19,22 @@ public class LocalContainer {
/**
* 添加车辆
- * @param vehicle 车辆信息
+ * @param vehicleInstance 车辆信息
*/
- public static void setVehicle(Vehicle vehicle){
- String vin = vehicle.getVin();
- VehicleInstance vehicleInstance = vehicleDataMap.get(vin);
- if (vehicleInstance == null){
- vehicleDataMap.put(vin,
- VehicleInstance.builder()
- .vehicleData(VehicleData.vehicleBuild(vehicle))
- .vehicle(vehicle)
- .build()
- );
+ public static void setVehicleInstance(VehicleInstance vehicleInstance){
+ String vin = vehicleInstance.getVehicle().getVin();
+ if (!vehicleDataMap.containsKey(vin)) {
+ vehicleDataMap.put(vin, vehicleInstance);
}
}
+ /**
+ * 获取车辆信息
+ * @param vin vin
+ * @return 车辆实例
+ */
+ public static VehicleInstance getVehicleInstance(String vin){
+ return vehicleDataMap.get(vin);
+ }
+
}
diff --git a/src/main/java/com/muyu/vehicle/core/VehicleConfiguration.java b/src/main/java/com/muyu/vehicle/core/VehicleConfiguration.java
index 38fa03f..da6ad8c 100644
--- a/src/main/java/com/muyu/vehicle/core/VehicleConfiguration.java
+++ b/src/main/java/com/muyu/vehicle/core/VehicleConfiguration.java
@@ -34,7 +34,7 @@ public class VehicleConfiguration implements ApplicationRunner {
while (true){
Page