限制生成的SWT对象的数量后不再处理

时间:2019-01-10 11:27:17

标签: java swt handle

我的应用程序使用多个Hashmaps存储Color和Image对象,这些对象在每次出现新Key时都会随机生成(可能是无限量)。

为减少内存使用量,我正在使用哈希函数将随机生成的颜色和图像的数量限制为229。 奇怪的是,当我存储几乎无限的颜色和图像时,该程序运行时没有出现重大问题(当然,除了泄漏)。

现在,我试图在几秒钟后奇怪地重复使用有限的对象集,但我不断收到异常:

org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTError: No more handles)

地图的生成如下所示:

static Map<Integer, Color> color = new Hashtable<>();
    private static final int MAX_COLORS = 229;

    private static void generateColor(String typeName) {
        if (mapping.containsKey(typeName)) {
            return;
        }

        Color c = generateRandomColor(typeName);
        color.put(typeNameHash(typeName), c);
    }

    private static Color generateRandomColor(String typeName) {
        if(color.containsKey(typeNameHash(typeName))){
            return color.get(typeNameHash(typeName));
        }
        int red = random.nextInt(255);
        int green = random.nextInt(255);
        int blue = random.nextInt(255);
        return new Color(Display.getCurrent(), red, green, blue);
    }

    private static int typeNameHash(String typeName){
        return Math.abs(typeName.hashCode())%MAX_COLORS;
    }

现在怎么可能我应该有更少的对象,而我却如此快地遇到这种异常?

谢谢!

1 个答案:

答案 0 :(得分:0)

这里问题的解决方案是,我仍在使用字符串作为键,而不是在某些情况下对字符串调用哈希函数。 由于HashMaps采用对象类型作为键,因此编译器没有对此发出警告。

检查我插入到Hashmap中的所有代码部分,并确保在各处都使用了哈希函数,即可解决此问题。