2015-08-07 5 views
0

сегодня я нашел довольно забавную проблему. В основном этот код не работает, если вы удалите System.out.println. Он никогда не выходит внутрь, если без него !!! (Thread запускается из основного класса)Как это имеет смысл?

import java.util.LinkedList; 
import java.util.Vector; 
import java.util.Queue; 



public class Matchmaking extends Thread{ 
    public static Vector onlinePlayers = new Vector(); 
    public static Queue<Player> queuedPlayers = new LinkedList<Player>(); 


    @Override 
    public void run() { 
     while(true){ 
      System.out.println(queuedPlayers.size()); 
      if(queuedPlayers.size() >= 2){ 
       new Matchmaking_GameFoundThreads(queuedPlayers.remove(),queuedPlayers.remove()); 
      } 
     } 
    } 
} 
+2

Проблемы параллелизма или отладки? – keyser

+0

Что делает 'size()' do, точно? –

+0

возвращает количество игроков в очереди (его код из игры). Поэтому каждый раз, когда в очереди есть 2+ игрока, они сопоставляются друг с другом. – Kores

ответ

2

LinkedList несинхронизирован.

Изменения в нем в одном потоке могут быть не видны в другом потоке. Попробуйте использовать:

public static List<Player> queuedPlayers = 
    Collections.synchronizedList(new LinkedList<Player>()); 
0

Я решил его, сделав очереди volatile. Я не уверен, что это хорошо, потому что я не знаком с использованием volatile, но он работал ...

Смежные вопросы