我在 仓库系统中 创建出库单时 现在主线程中创建出库单和出库单详情,然后利用多线程来给出库单分配库存,结果在执行 多线程的 run 方法时 StockOut 和 StockOutItem 在数据库中还没有插入完成。获取到的值为 null,有没有办法让多线程在主线程执行完插入出库单和出库单详情后再执行啊?// 创建出库单
@Transactional(rollbackFor = Exception.class)
public boolean insert(Long userId, StockOut entity, List<StockOutItem> stockOutItemList) {
    Date currentTime = new Date();
    boolean result = retBool(baseMapper.insert(entity));
    for (StockOutItem stockOutItem : stockOutItemList) {
        stockOutItem.setStockOutId(entity.getId());
        stockOutItem.setQualityGrade(1);
        stockOutItem.setCreater(userId);
        stockOutItem.setCreateTime(currentTime);
        stockOutItem.setEnable(true);
        result = retBool(stockOutItemMapper.insert(stockOutItem));
    }
    ThreadUtils.distributionInventory(entity.getId(), userId); // 执行多线程 分配库存
    return result;
}public class ThreadUtils {
public static void distributionInventory(Long stockOutId, Long modifier) {
ThreadPoolExecutor threadPool = ThreadPoolUtil.getThreadPool(); //获取线程池
threadPool.execute(new DistributionThread(stockOutId, modifier));
}
}
public class DistributionThread implements Runnable {
public void run(){
// 执行方法用到上面生成的  StockOut 和 StockOutItem
}
}

解决方案 »

  1.   

    个人觉得两种实现思路吧1: 等主线程执行完后,再启动依赖性的线程;2:就按你现在的来,只不过当判断获取到值为null的时候,再让他sleep一定时间,后再轮循执行,直到成功.
      

  2.   

    主线程和子线程都synchronize同一个对象A。
    子线程执行具体代码前检查能否获取到主线程插入的数据,如果未获取到则子线程调用A.sleep
    主线程插入完成后,调用A.notify
      

  3.   

    你在run方法中synchronize(obj){}
    在主线程执行插入之后再obj.notify(),这样应该就可以了吧