Очередь не работает с потоком? - PullRequest
1 голос
/ 15 сентября 2010

У меня есть следующий код, который извлекает первый элемент из очереди, только если у него есть хотя бы 2 элемента. По какой-то причине это не опрос первого элемента. Однако, если я добавлю туда инструкцию print, она будет напечатана и опрошена. Метод находится в потоке, и есть еще один поток, добавляющий элемент в очередь, этот поток читает из очереди.

...
public void run(){
    while(beginning){
        int size = queue.size();
        // adding this will cause the program to enter if below: System.out.println(size);
        if(size > 1){
            System.out.println("data: " + queue.poll());
            beginning = false;
        }
    }
}
...

Если добавить оператор println, он напечатает
1
1
....
2
данные: данные

Если оператор println удаляется, он ничего не печатает.

На самом деле, пока я что-то добавляю, thread.sleep (1) или оператор произвольной печати, он будет опрашивать данные и печатать их

Спасибо за любой ввод.

Ответы [ 4 ]

1 голос
/ 15 сентября 2010

Вам необходимо выполнить синхронизацию с объектом очереди:

public void run(){ 
    while(beginning){ 
        synchronized (queue) {
            int size = queue.size(); 
            // adding this will cause the program to enter if below: System.out.println(size); 
            if(size > 1){ 
                System.out.println("data: " + queue.poll()); 
                beginning = false; 
            } 
        } 
    }
} 

Это предотвратит доступ нескольких потоков к очереди в неподходящее время.

Вам также придется синхронизировать потокто есть добавление элементов в очередь аналогичным образом.

0 голосов
/ 15 сентября 2010

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

Но почему оператор print заставил бы его работать?

0 голосов
/ 15 сентября 2010

Вы должны быть осторожны при использовании общего ресурса между потоками.Вам следует подумать о том, чтобы использовать блокировку (токен), получить ее до доступа к очереди и освободить ее после использования.

0 голосов
/ 15 сентября 2010

Это похоже на проблему синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...