Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的多线程哈希表_Java_Multithreading_Hashtable - Fatal编程技术网

java中的多线程哈希表

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

MainThread有一个HashTable,它保存从customId到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();
    }
}
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任务保存在一个列表中,然后一个接一个地执行它们

你到底有什么问题???你想避免什么问题?你的问题到底是什么???您希望避免哪个问题?