MainThread有一个HashTable,它保存从customId到SubThread对象的映射,并将任务放到map中。 SubThread从地图中删除任务。 如何避免这个问题?
主题1:
public void start()
{
subThreadMap = new Hashtable<Integer, SubThread>();
while(true)
{
List<CloudPusherTaskInfo> taskInfos = TestDao.getTasks();
for (CloudPusherTaskInfo task : taskInfos)
{
distribute(task);
}
}
}
private void distribute(CloudPusherTaskInfo task)
{
SubThread subThread = null;
if(subThreadMap.containsKey(task.getCustomerId()))
{
/*
* if subThread exist, add a task to it
*/
subThread = subThreadMap.get(task.getCustomerId());
/* -----at this point, the other subThread maybe end, and return null--------*/
subThread.add(task);
}
else
{
/*
* if subThread is not exist, create a new subthread, then add a task and run it
*/
SubThread newThread = createNewSubThread(task.getCustomerId());
subThread = subThreadMap.put(task.getCustomerId(), newThread);
newThread.add(task);
new Thread(newThread).start();
}
}
答案 0 :(得分:2)
如果我理解正确,则subThread可能已完成其任务,并在调用subThreadMap.containsKey()
和subThreadMap.get()
之间结束。
不要重新发明轮子。您应该查看包java.util.concurrent
中的类,它提供了完成线程池和任务执行所需的所有功能。
答案 1 :(得分:1)
如果主要原因是获取Thread对象并启动它们,则不需要HashTable Hashtable<Integer, SubThread>();
。使CloudPusherTaskInfo实现Runnable接口,然后使用Executor.execute(new CloudPusherTaskInfo())
。或者您可以在List中保存CloudPusherTaskInfo任务并一个接一个地执行它们。