java - 使用 PriorityBlockingQueue 时出现 ClassCastException

标签 java multithreading message-queue

我正在尝试为我的游戏制作一个简单的消息管理器。但是,我收到以下异常:

Exception in thread "main" Exception in thread "Thread-4" java.lang.ClassCastException: MessageManagement.Message cannot be cast to java.lang.Comparable
at java.util.concurrent.PriorityBlockingQueue.siftUpComparable(Unknown Source)
at java.util.concurrent.PriorityBlockingQueue.offer(Unknown Source)
at java.util.concurrent.PriorityBlockingQueue.add(Unknown Source)
at MessageManagement.MessageManager.EnqueueMessage(MessageManager.java:69)

初始化代码为:

MessageManager messageManager = new MessageManager();
messageManager.start();

//send bootstrap message
CJournal.Journal(Main.class, "Testing messanger: ending bootstrapping message to messagemanager");
Message boot_strap_message = new Message();
boot_strap_message.mflag = EEventMachine.EM_BOOTSTRAP;
messageManager.EnqueueMessage(boot_strap_message);

实际的消息管理器是:

public  class MessageManager extends Thread {

    @Override
    public  void run() {
        // TODO Auto-generated method stub
        while (true)
        {

            if (!messagesQueue.isEmpty())
            {
                //pull message from queue
                Message message = messagesQueue.remove();

                //dispatch messages according to their type
                switch(message.mflag)
                {
                case EM_BOOTSTRAP:
                    CJournal.Journal(MessageManager.class, "Messaging system working properly.");
                default:
                    CJournal.Journal(MessageManager.class, "Dispatch Message Trashed");
                }
            }
        }
    }

    public static PriorityBlockingQueue<Message> messagesQueue = new PriorityBlockingQueue<Message>();

    public static void EnqueueMessage(Message message)
    {
        //Error happens here
        messagesQueue.add(message);
    }

为什么会出现此错误,我需要采取什么措施来修复它?

最佳答案

根据 PriorityBlockingQueue's javadoc

A priority queue relying on natural ordering also does not permit insertion of non-comparable objects (doing so results in ClassCastException).

您的Message 类需要实现Comparable

class Message implements Comparable<Message> {
    public int compareTo(Message m) {
        int comparisonResult = //comparison logic. 
        return comparisonResult;
    }
}

根据 Comparable#compareTo的 javadoc,compareTo

Set a negative integer, zero, or a positive integer if this message is less than, equal to, or greater than (respectively) the specified object.

您的另一个选择是提供 ComparatorPriorityBlockingQueue

关于java - 使用 PriorityBlockingQueue 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45021519/

相关文章:

database - 消息系统中针对表的队列

java - 为什么消费者线程首先启动?

android - 在非UI线程中显示ProgressDialog

java - 无法在 application.yaml 中为 liquibase 设置重复文件模式属性

java - 在不使用 Callable 的情况下从线程引发异常?

c++ - 我可以使用 ReadProcessMemory 在 Windows 中读取进程的程序内存吗?

Rabbitmq-设计消息重放服务

java - 单一生产者单一消费者现在我需要多个消费者

java - 用java运行bat文件

java - cxf : can't find request url for Observer