потоки. стоп старт потока в Runnable ожидающего инпут
От: objet  
Дата: 12.06.09 11:38
Оценка:
Здравствуйте.

имеется работающая реализация dataQueue с Producer и Receiver

Поток продьюсера считаывает горизонтально дюжину файлов, сортирует содержимое,
приводит в один List<DataItem> и обновляет цепочку данных

Поток ресивера считывает без промедления цепочку данных.

Потоки продьюсера и ресивера синхронизированы на сигнальный обьект, следящий за размером цепочки и концами файлов.

В ресивере каждый полученный DataItem должен будить потоки группы Наблюдателей
и без модификции считываться в них параллельно.

Пробная реализация Runnable Обсервера, с попыткой пробуждения, усыпления потока
через volatile поля не работает, входные данные (Integer) не обрабатывается.

Мне будут интересны указания на мои ошибки с реализацией

void run(){
  synchronized(this){
  }
}


с уважением,
обьект


////////////////////////////////////////////////////////
public class ObserverTest {

    static class Observer implements Runnable{
       private volatile boolean threadSuspended;
       private volatile boolean threadFinished;
       private Integer item;

        Observer(){
            threadSuspended = true;
            threadFinished = false;
        }

        public boolean isThreadSuspended() {
            return threadSuspended;
        }

        public Integer getItem() {
            return item;
        }
        public void setItem(Integer item) {
            this.item = item;
            setThreadSuspended(false); //
        }

        public void setThreadSuspended(boolean threadSuspended) {
            this.threadSuspended = threadSuspended;
        }

        public void setThreadFinished() {
            this.threadFinished = true;
        }

        public void run(){

            long interval = 10;  //in ms
            Thread thisThread = Thread.currentThread();
            synchronized(this){
                while (true) {
                    try {
                        thisThread.sleep(interval);


                        while (threadSuspended){
                            wait();
                        }

                        if (threadFinished)
                            break;

                    //processing
                        System.out.println(thisThread.getId()+" id  processing item: "+item);

                    //putting thread back to wait  state
                        this.setThreadSuspended(true);

                    } catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        Observer  obs = new Observer();
        Thread observerT = new Thread(obs);
        
        observerT.start();

        obs.setItem(new Integer(1));
        obs.setItem(new Integer(2));
        obs.setItem(new Integer(3));

        obs.setThreadFinished();
    }
}

Не забываем использовать теги подсветки кода. Blazkowicz
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.