Вставка значений перечисления в HashMap - PullRequest
4 голосов
/ 09 февраля 2011

Я делаю программу, в которой мне нужно вставить перечислимые значения в HashMap.Можем ли мы действительно сделать это?Я попробовал это разными способами, но не смог.

Может кто-нибудь, пожалуйста, помогите мне?Через программу мне нужно реализовать HashMap, содержащий 4 потоковых пула (чьи имена действуют как ключи), в соответствии с которыми у меня есть объект ThreapoolExcecutor.

Ниже приведен мой код:

public class MyThreadpoolExcecutorPgm {
    enum ThreadpoolName
    {
        DR,
        PQ,
        EVENT,
        MISCELLENEOUS;
    }
    private static String threadName;
    private static HashMap<String, ThreadPoolExecutor> threadpoolExecutorHash;

    public MyThreadpoolExcecutorPgm(String p_threadName) {
        threadName = p_threadName;

    }

    public static void fillthreadpoolExecutorHash() {
        int poolsize = 3;
        int maxpoolsize = 3;
        long keepAliveTime = 10;
        ThreadPoolExecutor tp = null;
        threadpoolExecutorHash = new HashMap<String, ThreadPoolExecutor>();

        ThreadpoolName poolName ;
        tp = new ThreadPoolExecutor(poolsize, maxpoolsize, keepAliveTime,
                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));

        threadpoolExecutorHash.put(poolName,tp);    //Here i am failing to implement currect put()


    }

Ответы [ 3 ]

7 голосов
/ 09 февраля 2011

Вы можете рассмотреть возможность использования EnumMap вместо HashMap здесь. EnumMap намного быстрее и эффективнее, чем HashMap, при использовании перечислимых значений, что, похоже, именно то, что вы здесь делаете.

3 голосов
/ 09 февраля 2011

Конечно, в качестве ключей на карте можно использовать перечисления.

Вы получаете сообщение об ошибке, поскольку threadpoolExecutorHash отображается с String с на ThreadPoolExecutor с, и происходит сбой, поскольку вы пытаетесь вставить String (poolName) в качестве ключа.

Просто измените с

threadpoolExecutorHash = new HashMap<String, ThreadPoolExecutor>();

до

threadpoolExecutorHash = new HashMap<ThreadpoolName, ThreadPoolExecutor>();

Как уже упоминалось @templatetypedef, есть даже специальная реализация Map, EnumMap, специально предназначенная для использования в качестве ключей перечислений.

0 голосов
/ 09 февраля 2011

Вы используете String в качестве ключа вашей HashMap, вместо этого вы должны использовать класс Enum. Ваш код должен выглядеть так:

public class MyThreadpoolExcecutorPgm {
enum ThreadpoolName
{
    DR,
    PQ,
    EVENT,
    MISCELLENEOUS;
}
private static String threadName;
private static HashMap<ThreadpoolName, ThreadPoolExecutor> threadpoolExecutorHash;

public MyThreadpoolExcecutorPgm(String p_threadName) {
    threadName = p_threadName;

}

public static void fillthreadpoolExecutorHash() {
    int poolsize = 3;
    int maxpoolsize = 3;
    long keepAliveTime = 10;
    ThreadPoolExecutor tp = null;
    threadpoolExecutorHash = new HashMap<ThreadpoolName, ThreadPoolExecutor>();

    ThreadpoolName poolName ;
    tp = new ThreadPoolExecutor(poolsize, maxpoolsize, keepAliveTime,
            TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));

    threadpoolExecutorHash.put(poolName,tp);    //Here i am failing to implement currect put()
}
...