2016-05-05 13 views
0

hier ist mein Thread-CodeVerfahren und Schloss Ausgabe in thread

Thread decode = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // System.out.println("decode thread started"); 
      synchronized (queueLock) { 
       while (true) { 
        if (!queue.isEmpty()) { 
         System.out.println(decoding()); 
        } 
       } 
      } 
     } 
    }); 

hier ist mein Mitglied Feld

private PriorityQueue<String> queue = new PriorityQueue<String>(); 
private Object queueLock = new Object(); 

und hier ist meine Methode

public Character decoding() { 
    String code = queue.poll();  
    Character chr; 
    Character[][] key = kG.getKey(); 
    String binary = null; 
    Character startingCharacter = code.charAt(0); 
    int iK = 0; 
    int ascii; 

    //System.out.println(code); when i use this other threads do not start also 

    for (int i = 0; i < KeyGenerator.getIr(); i++) 
     if (startingCharacter == key[i][0]) 
      iK = i; 

    for (int j = 0; j < KeyGenerator.getJr(); j++) { 
     if (code.contains(String.valueOf(key[iK][j]))) 
      binary = binary + "1"; 
     else 
      binary = binary + "0"; 
    } 

    ascii = Integer.parseInt(binary, 2); 
    chr = (char) (ascii + 'a'); 

    return chr; 
} 

die prioritqueue durch verwendet ein anderer Thread, aber ich machte es synchronisiert mit einem queueLock object. die Methode decoding funktioniert nicht in docode thread !!!

+0

Wie füllen Sie die Warteschlange? – Lee

+0

Warum haben Sie eine Endlosschleife innerhalb eines synchronisierten Blocks? Erwarten Sie, dass das Schloss jemals freigeschaltet wird? –

+0

@Lee Ich fülle es mit einem anderen Thread – mjdcsy

Antwort

0

Ich denke, Sie können das Objekt queueLock löschen und in der Warteschlange selbst sperren.

Die Art und Weise, wie Sie derzeit Ihren Code strukturiert haben, wird der Monitor nie veröffentlicht werden - ich denke, Sie müssen den Synchronisierungsblock innerhalb der wahren bewegen.

Alternativ würde ich mit einer BlockingQueue aussehen, so dass Sie die gesamte manuelle Verriegelung aus Ihrem Code bekommen können.

+0

Das Programm teilt die Warteschlange mit einem anderen Thread. Ich legte den synchronisierten Block in While-Schleife und ich denke, es funktioniert! – mjdcsy

+0

Sie verwenden dafür sehr alte Java-Axiome - das wäre eine hervorragende Ergänzung für einen ThreadPool und einen ExecutorCompletionService Lee