I have a thread that will poll the queue to get event. It event occur, take it out and handler it. But my thread seem doesn't know that queue is updated, so it keep polling even I added event to queue.
public class KWIC extends Application implements Runnable {
private static Map<Integer, KWIC_Event_Handler> handlerMap = new HashMap<Integer,KWIC_Event_Handler>();
/**
* Static block is mostly used for changing the default values of static variables.
* This block gets executed when the class is loaded in the memory.
*/
static{
registerHandler(KWIC_Event_Constant.USER_INPUT_EVENT, new UserInputEventHandler());
registerHandler(KWIC_Event_Constant.CIRCULAR_SHIFT_EVENT, new CircularShiftEventHandler());
registerHandler(KWIC_Event_Constant.SORTING_EVENT, new SortingEventHandler());
registerHandler(KWIC_Event_Constant.OUTPUT_EVENT, new OutputEventHandler());
}
/**
* This method is use to register handler to HashMap
* @param handlerType
* @param x
*/
private static void registerHandler(int handlerType, KWIC_Event_Handler x){
handlerMap.put(handlerType, x);
}
/**
* This method is use to get handler from HashMap
* @param handlerType
* @return KWIC_Event_Handler
*/
public static KWIC_Event_Handler getHandler(int handlerType){
return handlerMap.get(handlerType);
}
//Create event queue
public volatile BlockingQueue<KWIC_Event> eventQueue = new LinkedBlockingQueue<KWIC_Event>();
@Override
public void run() {
System.out.println("Thread begin");
System.out.println("Event Queue size is "+eventQueue.size());
while(!Thread.interrupted()){
try {
KWIC_Event event = eventQueue.take();
System.out.println("I see an Event let process it");
int eventType = event.getEventType();
KWIC_Event_Handler eventHandler = KWIC.getHandler(eventType);
eventHandler.handleEvent(event);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("I'm stuck here");
/** event is empty continue to poll() **/
}//End while
System.out.println("Exited while loop. Thread End");
}//End run
public static void main(String[] args){
launch(args);
}
//GUI stuff goes here
@Override
public void start(Stage primaryStage) throws Exception {
//Start Thread
KWIC myKWIC = new KWIC();
Thread thread_1 =new Thread(myKWIC);
thread_1.start();
primaryStage.setTitle("Welcome to KWIC");
GridPane overAllComponentLayout = new GridPane();
overAllComponentLayout.setVgap(10);
overAllComponentLayout.setHgap(10);
overAllComponentLayout.setPadding(new Insets(10));
/*Create Circular output Pane*/
GridPane cirOutputPane = new GridPane();
Label lblOp1 = new Label("Circular Shift");
TextArea cirOutput = new TextArea();
cirOutput.setWrapText(true);
cirOutput.setEditable(false);
cirOutputPane.add(lblOp1, 0, 0);
cirOutputPane.add(cirOutput, 0, 1);
Button clearCanvas_1 = new Button("Clear Screen");
clearCanvas_1.setOnAction((ActionEvent event) -> {
cirOutput.clear();
});
cirOutputPane.add(clearCanvas_1, 0, 2);
/*Create Sorting output Pane*/
GridPane sortOutputPane = new GridPane();
Label lblOp2 = new Label("Alphabetizer");
TextArea sortOutput = new TextArea();
sortOutput.setWrapText(true);
sortOutput.setEditable(false);
sortOutputPane.add(lblOp2, 0, 0);
sortOutputPane.add(sortOutput, 0, 1);
Button clearCanvas_2 = new Button("Clear Screen");
clearCanvas_2.setOnAction((ActionEvent event) -> {
sortOutput.clear();
});
sortOutputPane.add(clearCanvas_2, 0, 2);
/*Create Input Pane*/
GridPane userInputPane = new GridPane();
TextArea userInput = new TextArea();
//Add userInput to Pane
userInputPane.add(userInput, 0, 0);
Button doTheKWIC = new Button("Do KWIC");
doTheKWIC.setOnAction((ActionEvent event) -> {
//Get input String
String inputString = userInput.getText();
System.out.println("Button clicked");
//Create event
KWIC_Event userInputEvent = new UserInputEvent();
userInputEvent.setInputString(inputString);
//Offer event to queue
eventQueue.offer(userInputEvent);
System.out.println("Event offered");
System.out.println("Event Queue size is "+eventQueue.size());
});
userInputPane.add(doTheKWIC, 0, 1);
overAllComponentLayout.add(userInputPane, 0, 0);
overAllComponentLayout.add(cirOutputPane, 0, 1);
overAllComponentLayout.add(sortOutputPane, 0, 2);
Scene appScene = new Scene(overAllComponentLayout,500,500);
//Add the Scene to the Stage
primaryStage.setScene(appScene);
primaryStage.show();
/**
* When user kill the GUI, we kill the thread as well.
* */
primaryStage.setOnCloseRequest((WindowEvent we) -> {
thread_1.interrupt();
System.out.println("Interrupted Thread");
});
}
}
Aucun commentaire:
Enregistrer un commentaire