Skip to main content
add android constraint
Source Link
rolfl
  • 98.2k
  • 17
  • 220
  • 419

I had to make a message queue in an android app which my thread takes messages from and processes them. There can be multiple producers and duplicate messages should be avoided. Rate of insertion is erratic but not fast. Rate of consumption is slow. I came up with the following :

public class MessageQueueHolder<T> {

    public MessageQueueHolder(int initialSize) {
        messageSet = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
    }
    public MessageQueueHolder() {
        messageSet = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
    }
    private final Set<T> messageSet;

    /**
     * @param message to be inserted
     * @return if message already present returns false
     */
    public boolean insertMessage(T message) {
        return messageSet.add(message);
    }

    /**
     * @return returns the optional message and removes it
     */
    public Optional<T> takeMessage() {
        final Iterator<T> iterator = messageSet.iterator();
        if(!iterator.hasNext())
            return Optional.absent();
        final T message = iterator.next();
        iterator.remove();
        return Optional.of(message); //message can't be null
    }

    /**
     * Clear the message set
     */
    public void clear() {
        messageSet.clear();
    }
}

It seems to work just fine but I would appreciate some feedback :)

I had to make a message queue which my thread takes messages from and processes them. There can be multiple producers and duplicate messages should be avoided. Rate of insertion is erratic but not fast. Rate of consumption is slow. I came up with the following :

public class MessageQueueHolder<T> {

    public MessageQueueHolder(int initialSize) {
        messageSet = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
    }
    public MessageQueueHolder() {
        messageSet = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
    }
    private final Set<T> messageSet;

    /**
     * @param message to be inserted
     * @return if message already present returns false
     */
    public boolean insertMessage(T message) {
        return messageSet.add(message);
    }

    /**
     * @return returns the optional message and removes it
     */
    public Optional<T> takeMessage() {
        final Iterator<T> iterator = messageSet.iterator();
        if(!iterator.hasNext())
            return Optional.absent();
        final T message = iterator.next();
        iterator.remove();
        return Optional.of(message); //message can't be null
    }

    /**
     * Clear the message set
     */
    public void clear() {
        messageSet.clear();
    }
}

It seems to work just fine but I would appreciate some feedback :)

I had to make a message queue in an android app which my thread takes messages from and processes them. There can be multiple producers and duplicate messages should be avoided. Rate of insertion is erratic but not fast. Rate of consumption is slow. I came up with the following :

public class MessageQueueHolder<T> {

    public MessageQueueHolder(int initialSize) {
        messageSet = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
    }
    public MessageQueueHolder() {
        messageSet = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
    }
    private final Set<T> messageSet;

    /**
     * @param message to be inserted
     * @return if message already present returns false
     */
    public boolean insertMessage(T message) {
        return messageSet.add(message);
    }

    /**
     * @return returns the optional message and removes it
     */
    public Optional<T> takeMessage() {
        final Iterator<T> iterator = messageSet.iterator();
        if(!iterator.hasNext())
            return Optional.absent();
        final T message = iterator.next();
        iterator.remove();
        return Optional.of(message); //message can't be null
    }

    /**
     * Clear the message set
     */
    public void clear() {
        messageSet.clear();
    }
}

It seems to work just fine but I would appreciate some feedback :)

Source Link
Dexter
  • 435
  • 5
  • 16

Message queue with multiple producer, single consumer and no duplicates

I had to make a message queue which my thread takes messages from and processes them. There can be multiple producers and duplicate messages should be avoided. Rate of insertion is erratic but not fast. Rate of consumption is slow. I came up with the following :

public class MessageQueueHolder<T> {

    public MessageQueueHolder(int initialSize) {
        messageSet = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
    }
    public MessageQueueHolder() {
        messageSet = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
    }
    private final Set<T> messageSet;

    /**
     * @param message to be inserted
     * @return if message already present returns false
     */
    public boolean insertMessage(T message) {
        return messageSet.add(message);
    }

    /**
     * @return returns the optional message and removes it
     */
    public Optional<T> takeMessage() {
        final Iterator<T> iterator = messageSet.iterator();
        if(!iterator.hasNext())
            return Optional.absent();
        final T message = iterator.next();
        iterator.remove();
        return Optional.of(message); //message can't be null
    }

    /**
     * Clear the message set
     */
    public void clear() {
        messageSet.clear();
    }
}

It seems to work just fine but I would appreciate some feedback :)