这里是在接口的调用,在这个位置。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;
}
}
有没有好兄弟请教一下。