wait() i notifyall()

0

Witam serdecznie.
Od razu powiem, że w Javie nigdy nie pisałem a dostałem zadanie do zrobienia.

treść zadania:


Serwer rozsyłający wiadomość pozostałym klientom (1 punkt)
Zamiast wypisywać na standardowe wyjście niech wątki umieszczają wiadomość w
obiekcie, który będą współdzieliły.
class Mailbox {
    private String msg;
    public Mailbox() {
    }
    public synchronized void put(String msg) {
        while (this.msg != null)
        ;
        this.msg = msg;
    }
    public synchronized String take() {
        while (this.msg == null)
        ;
        String msgCopy = this.msg;
        this.msg = null;
        return msgCopy;
        }
}

Popraw kod tak, aby wątki nie czekały aktywnie — skorzystaj w tym celu z metody
wait(), a przed zakończeniem wywołania metod put i take zbudź wątki wywołaniem
metody notifyAll(). Stwórz dodatkowy wątek, który będzie się zajmował wysyłaniem
otrzymywanych wiadomości do reszty, przy czym niech wiadomości mają następujący
format:
— M:Wiadomość do wszystkich spowoduje wysłanie komunikatu Wiadomość do
wszystkich wszystkim uczestnikom czatu,
— E:Wiadomość tylko do mnie spowoduje wysłanie komunikatu tylko do nadawcy,
— Q: spowoduje rozłączenie się z serwerem.

a oto co udało mi się do tej pory napisać


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *
 * @author drosiak
 */
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(6666);
        try {
            while (true) {
                new ClientThread(server.accept()).start();
            }
        } finally {
            server.close();
        }
    }

    private static class ClientThread extends Thread {

        private Socket socket;

        public ClientThread(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            try {
                DataInput in = new DataInputStream(socket.getInputStream());
                DataOutput out = new DataOutputStream(socket.getOutputStream());
                String line;
                while ((line = in.readLine()) != null) {
                    System.out.println(line);
                    out.write(line.getBytes());
                }
            } catch (IOException e) {
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                }
            }
        }
    }

    class Mailbox {

        private String msg;

        public Mailbox() {
        }

        public synchronized void put(String msg) {
            while (this.msg != null)
                ;
            this.msg = msg;
        }

        public synchronized String take() {
            while (this.msg == null)
                ;
            String msgCopy = this.msg;
            this.msg = null;
            return msgCopy;
        }
    }
}

i teraz zwracam się z pytaniem jak dokończyć to.
Dziękuję za pomoc

0

nie mogę edytować poprzedniego postu więc dodaję tutaj.
Dopisałem trochę do kodu na podstawie materiałów z neta.
Sprawdźcie czy dobrze myślę. Pozostało tylko stworzyć ten wątek który będzie rozsyłał wiadomości i tego nie mam.


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author drosiak
 */
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(6666);
        try {
            while (true) {
                new ClientThread(server.accept()).start();
            }
        } finally {
            server.close();
        }
    }

    private static class ClientThread extends Thread {

        private Socket socket;
        Mailbox mailbox;

        public ClientThread(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            try {
                DataInput in = new DataInputStream(socket.getInputStream());
                DataOutput out = new DataOutputStream(socket.getOutputStream());
                String line;
                while ((line = in.readLine()) != null) {
                    try {
                        mailbox.put(line);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            } catch (IOException e) {
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                }
            }
        }
    }  

    class Mailbox {

        private String msg;

        public Mailbox() {
        }

        public synchronized void put(String msg) throws InterruptedException {
            while (this.msg != null){
                wait();
            }
            this.msg = msg;
            notifyAll();
        }

        public synchronized String take() throws InterruptedException {
            notifyAll();
            while (this.msg == null){
                wait();
            }
            String msgCopy = this.msg;
            this.msg = null;
            return msgCopy;
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0