2017-07-06 90 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類。