java中的多线程哈希表
MainThread有一个HashTable,它保存从customId到SubThread对象的映射,并将任务放入映射。子线程从映射中删除任务。 如何避免这个问题 线程1:java中的多线程哈希表,java,multithreading,hashtable,Java,Multithreading,Hashtable,MainThread有一个HashTable,它保存从customId到SubThread对象的映射,并将任务放入映射。子线程从映射中删除任务。 如何避免这个问题 线程1: public void start() { subThreadMap = new Hashtable<Integer, SubThread>(); while(true) { List<CloudPusherTaskInfo> t
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();
}
}
public void start()
{
subThreadMap=newhashtable();
while(true)
{
List taskInfos=TestDao.getTasks();
for(CloudPusherTaskInfo任务:任务信息)
{
分配(任务);
}
}
}
私有void分发(CloudPusherTaskInfo任务)
{
SubThread SubThread=null;
if(subThreadMap.containsKey(task.getCustomerId()))
{
/*
*如果存在子线程,则向其添加任务
*/
subThread=subThreadMap.get(task.getCustomerId());
/*----此时,另一个子线程可能结束,并返回null--------*/
添加(任务);
}
其他的
{
/*
*如果子线程不存在,请创建一个新的子线程,然后添加一个任务并运行它
*/
SubThread newThread=createNewSubThread(task.getCustomerId());
subThread=subThreadMap.put(task.getCustomerId(),newThread);
添加(任务);
新线程(newThread.start();
}
}
如果我理解正确,子线程可能已完成其任务,并在调用subThreadMap.containsKey()
和subThreadMap.get()
之间结束
不要重新发明轮子。您应该查看包
java.util.concurrent
中的类,它提供了完成线程池和任务执行所需的所有功能。如果我理解正确,子线程可能已完成其任务,并在调用subThreadMap.containsKey()之间结束
和子线程映射.get()
不要重新发明轮子。您应该查看包
java.util.concurrent
中的类,它提供了完成线程池和任务执行所需的所有功能如果代码>的主要原因是获取线程对象并启动它们,则不需要它。让CloudPusherTaskInfo实现可运行接口,然后使用Executor.execute(新的CloudPusherTaskInfo())
。或者,您可以将CloudPusherTaskInfo任务保存在一个列表中,然后一个接一个地执行它们 哈希表HashTable()如果代码>的主要原因是获取线程对象并启动它们,则不需要它。让CloudPusherTaskInfo实现可运行接口,然后使用Executor.execute(新的CloudPusherTaskInfo())
。或者,您可以将CloudPusherTaskInfo任务保存在一个列表中,然后一个接一个地执行它们 你到底有什么问题???你想避免什么问题?你的问题到底是什么???您希望避免哪个问题?