1

无论如何,是否可以在其中调用 A 类调用 notify(),从后台运行的线程中唤醒 wait() 上的线程以获得该对象的锁?

谢谢。

编辑:

请忽略不必要的代码。我想向您展示我是如何真正实现它的。

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




}
4

2 回答 2

5

你的问题的简短回答是不。

你的问题很不清楚,但我认为这就是你要问的:

  • A 类扩展Thread并且Runnable一个线程正在以某个A对象作为目标运行。称之为AThread。

  • 该线程拥有 A Object 上的锁,而其他线程 (OThread) 正在等待该锁。

  • 您希望其他线程(BgThread)能够唤醒等待的线程。

重要的一点是 notify 只能从拥有锁的线程中调用。因此,如果后台线程不拥有锁,则它无法对其调用 notify。

编辑:

查看您添加的代码,您似乎正在尝试在以下位置构建等待机制BufferImp:如果requests已满,则会CheckWaitThread将 bufferFull 消息写入传入套接字,以便客户端可能停止发送更多请求。并且不知何故(因为其他线程弹出和处理请求)在将来的某个时间机器将再次开始旋转。

没必要这么辛苦

  • 为什么需要发送响应并等待requests集合在单独的线程中释放?为什么你不能从这个线程本身发送它?

  • 与其管理requests array自己,不如看看BlockingQueue正是它创建了这个目的。

于 2011-10-09T12:59:11.940 回答
0

所有代码都在一个线程中运行,后台和前台之间的区别是名义上的。

要调用 notify(),您只需锁定通知的对象。

于 2011-10-09T13:07:59.117 回答