Java 多线程执行顺序问题 ThreadPoolExecutor

狼王_ 2019-06-20 07:18:49
我在 仓库系统中 创建出库单时 现在主线程中创建出库单和出库单详情,然后利用多线程来给出库单分配库存,结果在执行 多线程的 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
}
}
...全文
427 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Unicode Escapes 2019-06-21
  • 打赏
  • 举报
回复
主线程和子线程都synchronize同一个对象A。 子线程执行具体代码前检查能否获取到主线程插入的数据,如果未获取到则子线程调用A.sleep 主线程插入完成后,调用A.notify
getdate 2019-06-21
  • 打赏
  • 举报
回复
个人觉得两种实现思路吧 1: 等主线程执行完后,再启动依赖性的线程; 2:就按你现在的来,只不过当判断获取到值为null的时候,再让他sleep一定时间,后再轮循执行,直到成功.
_沉浮_ 2019-06-21
  • 打赏
  • 举报
回复
上面的操作是异步的?
djeclipse 2019-06-21
  • 打赏
  • 举报
回复
你在run方法中synchronize(obj){}
在主线程执行插入之后再obj.notify(),这样应该就可以了吧
weixin_40290083 2019-06-20
  • 打赏
  • 举报
回复
非得要这样做,当主线程的插入任务完成后,让主线程再启动子线程。
weixin_40290083 2019-06-20
  • 打赏
  • 举报
回复
即然是这样就没有必要多线程

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧