React Native多线程任务调度:硬件线程任务同步问题求助
解决React Native中硬件异步任务的串行同步问题
核心问题分析
你当前的代码问题在于:SingleThreadExecutor仅保证提交的任务代码逻辑串行执行,但第三方库的A()/B()/C()/D()是异步硬件操作——任务线程会快速执行到finally块的E()并结束任务,而此时硬件的异步操作可能还未完成。后续提交的任务会立刻启动新的A(),导致前一个硬件任务未收尾就启动新任务,触发硬件崩溃。
解决方案
核心思路是:让每个提交到SingleThreadExecutor的任务,必须等待所有异步硬件操作(A→B→C→D)完全完成后,再执行收尾操作E(),最后才结束任务。利用SingleThreadExecutor的串行特性,自然就能保证下一个任务在前一个任务的全流程(硬件操作+收尾)完成后再启动。
步骤1:包装异步硬件方法为可等待形式
第三方异步API通常会提供回调通知完成状态,我们可以用CompletableFuture将其包装为阻塞式调用:
// 包装第三方异步方法A() private CompletableFuture<Void> wrapA() { CompletableFuture<Void> future = new CompletableFuture<>(); // 假设第三方A()的异步回调形式如下(根据实际API调整) A( () -> future.complete(null), // 成功回调:标记Future完成 exception -> future.completeExceptionally(exception) // 失败回调:传递异常 ); return future; } // 同理包装B()、C()、D() private CompletableFuture<Void> wrapB() { CompletableFuture<Void> future = new CompletableFuture<>(); B(() -> future.complete(null), exception -> future.completeExceptionally(exception)); return future; } private CompletableFuture<Void> wrapC() { CompletableFuture<Void> future = new CompletableFuture<>(); C(() -> future.complete(null), exception -> future.completeExceptionally(exception)); return future; } private CompletableFuture<Void> wrapD() { CompletableFuture<Void> future = new CompletableFuture<>(); D(() -> future.complete(null), exception -> future.completeExceptionally(exception)); return future; }
如果第三方库没有提供回调,只能通过轮询状态判断完成,可以用循环等待:
// 假设第三方库提供isACompleted()判断任务是否完成 private void waitForAComplete() throws InterruptedException { while (!isACompleted()) { Thread.sleep(100); // 每隔100ms轮询一次,避免过度占用CPU } } // 同理实现waitForBComplete()、waitForCComplete()、waitForDComplete()
步骤2:修正任务执行逻辑
移除冗余的CountDownLatch,直接利用SingleThreadExecutor的串行特性,在任务内部等待所有硬件操作完成后再执行收尾:
class TaskExecutor { static ExecutorService singleTaskExecutor = Executors.newSingleThreadExecutor(); @ReactMethod static void displaySale(String msg_1, String msg_2, Context reactContext, QuarkCallback callback, FiscalPrinterExecuter fiscalPrinterExecuter, LogModule log) { singleTaskExecutor.submit(() -> { try { // 依次等待所有异步硬件操作完成(按顺序执行A→B→C→D) wrapA().get(); wrapB().get(); wrapC().get(); wrapD().get(); // 如果A/B/C/D可以并行执行,用allOf效率更高: // CompletableFuture.allOf(wrapA(), wrapB(), wrapC(), wrapD()).get(); // 硬件操作全部完成后,回调通知RN层(可选) callback.invoke("success"); } catch (Exception e) { log.addRecordToLogJ("Fiscal Error or Interruption: " + e.getMessage()); callback.invoke("error", e.getMessage()); } finally { // 只有所有硬件操作完成后,才执行收尾操作E() E(); } }); } }
关键说明
- SingleThreadExecutor的串行性:该线程池保证任务队列中的任务依次执行,只有前一个任务的
Runnable完全执行完毕,才会启动下一个任务。只要每个任务内部等待硬件操作+收尾完成,就不会出现并行冲突。 - 异常安全:
finally块确保无论硬件操作是否成功,E()都会执行,避免硬件资源泄漏。 - UI线程不阻塞:
@ReactMethod调用是在UI线程,但任务逻辑被提交到后台线程执行,不会阻塞RN的UI渲染。
内容的提问来源于stack exchange,提问作者Ufuk Mirza Yüksel
相关产品推荐
相关产品推荐

