0

MainThread には HashTable があり、customId から SubThread オブジェクトへのマッピングを保存し、タスクをマップに配置します。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();
    }
}
4

2 に答える 2

2

あなたの理解が正しければ、サブスレッドがタスクを終了し、 と の呼び出しの間に終了した可能性がsubThreadMap.containsKey()ありsubThreadMap.get()ます。

車輪を再発明しないでください。java.util.concurrentスレッド プーリングとタスクの実行に必要なすべての機能を提供するpackage のクラスを確認する必要があります。

于 2012-10-16T03:15:39.710 に答える
1

Hashtable<Integer, SubThread>();主な理由が Thread オブジェクトを取得して開始することである場合、HashTable は必要ありません。CloudPusherTaskInfo に Runnable インターフェイスを実装させてから、Executor.execute(new CloudPusherTaskInfo()). または、CloudPusherTaskInfo タスクをリストに保持して、それらを次々に実行することもできます。

于 2012-10-16T05:26:21.050 に答える