java中的多个线程HashTable

时间:2012-10-16 02:27:41

标签: java multithreading hashtable

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();
    }
}

2 个答案:

答案 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任务并一个接一个地执行它们。