2017-07-06 89 views
0

我正在尝试编写一个简单的消息管理器,但是没有任何消息显示在我的队列中。消息管理器破坏

调用它的代码是:

//initialize message manager 
    CJournal.Journal(Main.class, "Initializing message manager"); 
    MessageManager messageManager = new MessageManager(); 
    messageManager.run(); 

    //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 implements Runnable { 

    PriorityQueue<Message> messagesQueue = new PriorityQueue<Message>(); 


    public void EnqueueMessage(Message message) 
    { 
     messagesQueue.add(message); 
    } 

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


      if (!messagesQueue.isEmpty()) 
      { 
       CJournal.Journal(MessageManager.class, "Found a message"); 
       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"); 
       } 
      } 
     } 
    } 

而且调试输出是:

13 In Class::class Sampler.Main Journal Entry:Testing Event Manager 
14 In Class::class Sampler.Main Journal Entry:Created dummy CEvent. Pushing to event manager. 
15 In Class::class Sampler.Main Journal Entry:Initializing message manager 

我应该得到, “信息系统正常工作”

任何想法?

-------------------------------------------------------------- 
O`11 In Class::class SchedulingManager.Timer.CTimerManager Journal Entry:Creating a CTimer Object 
12 In Class::class SchedulingManager.Timer.CTimerManager Journal Entry:Timer creation success. Adding CTimer object to internal list Of Timers 
13 In Class::class Sampler.Main Journal Entry:Testing Event Manager 
14 In Class::class Sampler.Main Journal Entry:Created dummy CEvent. Pushing to event manager. 
15 In Class::class Sampler.Main Journal Entry:Initializing message manager 
16 In Class::class Sampler.Main Journal Entry:Testing messanger: ending bootstrapping message to messagemanager 
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) 
    at Sampler.Main.main(Main.java:128) 
java.util.NoSuchElementException 
    at java.util.AbstractQueue.remove(Unknown Source) 
    at MessageManagement.MessageManager.run(MessageManager.java:47) 

而这种代码:

'公共类给messageManager继承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) 
    { 
     messagesQueue.add(message); 
    } 

这是怎么了声明我的线程:

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); 

    Loop loop = new Loop(); //hand over to game loop 

我不是确定问题是什么。

回答

0

您正在调用run()在您的MessageManager从同一Thread然后进入无限循环。

您需要将您的MessageManager换成新的Thread并启动该线程。

new Thread(messageManager).start(); 

然而,你可能需要改变你的PriorityQueue如果你打算从多个线程

从JavaDoc的访问:

注意,此实现不是同步的。如果任何线程修改队列,多线程不应该同时访问PriorityQueue实例。而是使用线程安全的PriorityBlockingQueue类。