diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java index 5a3ca828..42062e47 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java @@ -150,27 +150,6 @@ public class MpMasterService extends Service { //用于创建单例线程保证该线程在项目中唯一 private static final AtomicBoolean created = new AtomicBoolean(false); -// private static Thread batteryVoltageThread; - -// public static Thread getInstance(Runnable runnable) { -// if (!created.getAndSet(true)) { -// batteryVoltageThread = new Thread(runnable); -// batteryVoltageThread.start(); -// } -// return batteryVoltageThread; -// } - - - private static ExecutorService batteryVoltageThread; - - public static synchronized ExecutorService getSingleThreadExecutor() { - if (batteryVoltageThread == null || batteryVoltageThread.isShutdown()) { - batteryVoltageThread = Executors.newSingleThreadExecutor(); - } - return batteryVoltageThread; - } - - AtomicInteger reqCode = new AtomicInteger(0); public MpMasterService() { @@ -298,6 +277,7 @@ public class MpMasterService extends Service { IntentFilter intentFilter; intentFilter = new IntentFilter(SimUtil.SMS_SEND_ACTION); registerReceiver(mSmsSnedReceiver, intentFilter); + } public String getIccid(int number) { @@ -1114,19 +1094,11 @@ public class MpMasterService extends Service { } private void buildChargingBatteryVoltage(long ts) { - if (batteryVoltageThread != null && !batteryVoltageThread.isShutdown()) { - logger.info("电压线程在执行退出"); - return; - } - getSingleThreadExecutor().execute(new Runnable() { + SingletonThread instance = SingletonThread.getInstance(); + instance.executeTask(new Runnable() { @Override public void run() { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - logger.info("电压线程编号" + batteryVoltageThread.hashCode()); + logger.info("电压线程开始" ); int val = 0; for (int idx = 0; idx < 3; idx++) { logger.info("电压测试第" + idx + "次开始读取"); diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/SingletonThread.java b/mpmaster/src/main/java/com/xypower/mpmaster/SingletonThread.java new file mode 100644 index 00000000..01223046 --- /dev/null +++ b/mpmaster/src/main/java/com/xypower/mpmaster/SingletonThread.java @@ -0,0 +1,47 @@ +package com.xypower.mpmaster; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Logger; + +public class SingletonThread { + private static SingletonThread instance; + private Thread workerThread; + private final AtomicBoolean isRunning = new AtomicBoolean(false); + private final Object lock = new Object(); // 用于同步的锁对象 + private SingletonThread() {} + + public static synchronized SingletonThread getInstance() { + if (instance == null) { + instance = new SingletonThread(); + } + return instance; + } + + public void executeTask(Runnable task) { + synchronized (lock) { // 加锁,确保检查+设置是一个原子操作 + if (isRunning.get()) { + return; + } + isRunning.set(true); // 立即标记为运行中,防止其他线程进入 + } + + workerThread = new Thread(() -> { + try { + task.run(); + } finally { + isRunning.set(false); // 任务完成后重置状态 + } + }); + workerThread.start(); + } + + public boolean isThreadRunning() { + return isRunning.get(); + } + + public void waitForCompletion() throws InterruptedException { + if (workerThread != null) { + workerThread.join(); + } + } +} \ No newline at end of file