Сделайте класс для вызова его notify () из другого класса в Java - PullRequest
1 голос
/ 09 октября 2011

Есть ли в любом случае , чтобы сделать внутри него вызов класса А notify (), чтобы разбудить потоки при ожидании () блокировки этого объекта, из потока, работающего в фоне ?

спасибо.

РЕДАКТИРОВАТЬ:

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

Messenger - это сериализованный объект.

Поток "ServerHandler" вызовет bufferImpObject.put(<Messenger Obj>, <ServerHandler instance>, <socket instance>)

public class BufferImp {
    private Messenger[] requests;
    public  static int req_size;
    public static int req_count;


     Socket s;
     Messenger msg;
     InputStream is;
     ObjectInputStream ois;
     OutputStream os;
     ObjectOutputStream oos;



    public BufferImp(int size) {
        this.req_size = size;
        this.req_count = 0;
        requests = new Messenger[size];

    }



     class CheckWaitThread extends Thread{
        Thread t;
        String s;
        Socket incoming_socket;



        CheckWaitThread(String s, Thread t, Socket incoming_socket){
            this.t = t;
            this.s = s;
            this.incoming_socket = incoming_socket;


        }
        @Override
        public void run(){
            try {
               // I want to keep on checking till slots are FREE
               // IF FREE, call notify() of BufferImp to get back WAITING (inactive) ServerHandler thread
               if(t.getState().equals(State.WAITING)){ 
                              os = incoming_socket.getOutputStream();
                              AppendableObjectOutputStream oosa = new AppendableObjectOutputStream(os);
                              oosa.writeObject(new Messenger("bufferFull", null, "true"));


                }
                t.join();
            } catch (IOException ex) {
                Logger.getLogger(BufferImp.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InterruptedException ex) {
                Logger.getLogger(BufferImp.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    // insert incoming Message objects into "requests" queue 
    public synchronized boolean put(Messenger o, Thread t, Socket s) throws InterruptedException {


        while(req_size == req_count) {
            CheckWaitThread cw = new CheckWaitThread("<----------CheckWaitThread----------->", t, s);
            cw.start();
            wait(); 


        }

        // these parts need to be executed when notify() is called.
        requests[cur_req_in] = o;
        cur_req_in = (cur_req_in + 1) % req_size;
        req_count++;
        notifyAll();
        Messenger msg = (Messenger) o;


        return true;
    }




}

Ответы [ 2 ]

5 голосов
/ 09 октября 2011

Короткий ответ на ваш вопрос - нет.

Ваш вопрос очень неясен, но я думаю, что вы задаете этот вопрос:

  • Класс A расширяется Thread и Runnable, и поток работает с некоторым объектом A в качестве цели.Назовите его AThread.

  • Этот поток владеет блокировкой объекта A, и другие потоки (OThread) ожидают этого.

  • Выхотите, чтобы какой-то другой поток (BgThread) мог разбудить ожидающие потоки.

Важным моментом является то, что уведомление может вызываться только из потока , который владеть замком .Таким образом, если фоновый поток не владеет блокировкой, он не может вызвать уведомление об этом.

РЕДАКТИРОВАТЬ:

Глядя на код, который вы добавили, кажется, что вы пытаетесь встроить механизм ожидания в BufferImp: если requests заполнен до полной емкости, то CheckWaitThreadзапишет сообщение bufferFull во входящий сокет, так что, предположительно, клиенты перестанут посылать больше запросов.И каким-то образом (из-за того, что другие потоки выскакивают и обрабатывают запросы), когда-нибудь в будущем машина снова начнет вращаться.

Нет необходимости работать так усердно

  • Зачем вам нужно отправлять ответ и ждать, пока коллекция requests не высвободится в отдельном потоке?Почему вы не можете отправить его из этой темы?

  • Вместо того, чтобы управлять requests array самостоятельно, посмотрите на BlockingQueue , который создал именно эту цель.

0 голосов
/ 09 октября 2011

Весь код выполняется в потоке, и разница между фоном и передним планом является условной.

Чтобы вызвать notify (), вам нужно только заблокировать уведомленный объект.

...