2016-05-05 5 views
0

はここにここに 方法とロックの問題は

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

は私のメンバーフィールド

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

であり、ここで私の方法prioritqueueがで使用している

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

である私のスレッドコードであります別のスレッドが、私はqueueLock objectを使って同期させました。 メソッドdecodingは機能していませんdocode thread

+0

キューをどのように満たしていますか? – Lee

+0

なぜ同期ブロック内に無限ループがありますか?ロックが解除されることを期待していますか? –

+0

@Lee私は別のスレッドでそれを埋めています – mjdcsy

答えて

0

私はqueueLockオブジェクトを削除し、キュー自体をロックすることができると思います。

あなたのコードは現在モニターされていません。私はあなたが真の間に同期ブロックを動かす必要があると思います。

また、BlockingQueueを使用すると、コードからすべての手動ロックが解除されます。

+0

プログラムはキューを別のスレッドと共有します。私はwhileループで同期ブロックを入れ、私はそれが動作すると思います! – mjdcsy

+0

これは非常に古いJavaの公理を使用しています - これはThreadPoolとExecutorCompletionServiceのための優れた適合です Lee

関連する問題