猜测一下,你当在主线程时,response在单独TaskMp4 tm时没有关闭是因为response在主线程对象还没有close关闭释放,当你执行excute方法时,对象在你子线程调用,此时主线程结束了对象释放了,所以说数据就丢失了
关于线程中数据丢失的问题
这里是在接口的调用,在这个位置。response的数据丢失了。如果去掉线程池的execute方法,单独的TaskMp4 tm没有数据丢失的情况
ThreadPoolMp4 t = ThreadPoolMp4.getThreadPool(100);
TaskMp4 tm = new TaskMp4(response, fileName, mac, Utils.pathUrl,
Utils.patFileUrl);
//将tm放入线程池
t.execute(tm);
// 打印当前线程池的工作信息
System.out.println(t.toString());
这里是线程池的方法
// 执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器决定
public void execute(Runnable task) {
synchronized (taskQueue) {
taskQueue.add(task);
taskQueue.notify();
}
}
/**
* 内部类,工作线程
*/
private class WorkThread extends Thread {
// 该工作线程是否有效,用于结束该工作线程
private boolean isRunning = true;
/*
* 关键所在啊,如果任务队列不空,则取出任务执行,若任务队列空,则等待
*/
@Override
public void run() {
Runnable r = null;
while (isRunning) {// 注意,若线程无效则自然结束run方法,该线程就没用了
synchronized (taskQueue) {
while (isRunning && taskQueue.isEmpty()) {// 队列为空
try {
taskQueue.wait(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (!taskQueue.isEmpty())
r = taskQueue.remove(0);// 取出任务
}
if (r != null) {
r.run();// 执行任务
}
finished_task++;
r = null;
}
}
// 停止工作,让该线程自然执行完run方法,自然结束
public void stopWorker() {
isRunning = false;
}
}
有没有好兄弟请教一下。
- 点赞
- 写回答
- 关注问题
- 收藏
- 复制链接分享
- 邀请回答
1条回答
为你推荐
- [分布式锁]Redisson关于redis主从模式下面的问题
- 为什么python使用线程池会丢失部分数据?
- python
- 1个回答
- 如何解决秒杀系统中缓存扣除后意外宕机的问题?
- 在并发下,Spring已经提交事务,并且释放JDBC连接后,新的事务无法查询到之前事务添加的数据
- Golang从管道中读取大量数据
- tar
- stdin
- 2个回答
- 为什么多线程给list添加内容,最后返回为空?
- java
- 6个回答
- c# winform ,大片机接收缓存有限,串口向单片机发送大量数据时,只会执行前面的内容,后面的数据全部丢失
- httpclient 请求过快,导致数据抓取不全
- IT行业问题
- 计算机技术
- it技术
- 编程语言问答
- 互联网问答
- 0个回答
- 循环进行多文件输出时, 文件丢失.
- 多线程
- java
- file
- 文件上传
- 6个回答
- java多线程高并发下的oracle数据库异常
- MFC多线程如果出现故障,数据保存可以借助于什么数据结构?
- 多线程
- 2个回答
- MFC多线程程序如果一个线程报错
- 多线程
- 2个回答
- js中for循环每次循环如何暂停一秒后执行
- ajax
- 函数
- 5个回答
- TCP读设备大量数据产生丢包
- 丢包
- tcp
- 1个回答