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
}
}
...全文
454 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
即然是这样就没有必要多线程
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在Java编程中,实现多线程按指定顺序同步执行是一个常见的需求,即如何让多个线程按照既定的顺序依次执行。以下是三种实现方式,分别是使用newSingleThreadExecutor、join方法和ThreadPoolExecutor。 newSingleThreadExecutor可以创建一个单线程的线程池。当多个任务提交到该线程池时,线程池会按照任务提交的顺序依次执行。如果当前线程意外终止,线程池会自动创建一个新的线程继续执行任务。这种方式简单且能保证任务的执行顺序。示例代码如下: join方法可以让一个线程等待另一个线程执行完成后再继续执行。通过在每个线程启动后调用join方法,可以确保线程按启动顺序依次执行。示例代码如下: ThreadPoolExecutor可以通过设置核心线程数为1来实现单线程执行。这样线程池中始终只有一个线程在运行,从而保证任务的执行顺序。示例代码如下: ThreadPoolExecutor的构造函数如下: 参数含义如下: corePoolSize:核心线程数,建议与CPU核心数一致。当线程池内的线程数小于corePoolSize时,会新建线程执行任务。 maximumPoolSize:线程池允许的最大线程数。当任务队列满且线程数小于maximumPoolSize时,会新建线程;否则执行拒绝策略。 keepAliveTime:线程的最大空闲时间,例如设置为60秒,则线程空闲60秒后自动结束。 通过以上三种方法,可以实现Java多线程按指定顺序同步执行。

81,117

社区成员

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

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