Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Java Rmi e notifyAll()

  1. #1

    Java Rmi e notifyAll()

    ciao a tutti
    Sto crenado un semplice software tipo chat utilizzando Java Rmi.
    Il programma contiene una classe (caricata nel rmi registry) con una variabile String contenente il messaggio e due thread uno ke legge e uno ke scrive.
    Il problema č che sembra ke la notifyAll() non abbia effetto, ad esempio se il thread di scrittura scrive qlc e poi richiama la notifyAll() per risvegliare il thread di lettura.. quest'ultimo non si sveglia.

    come mai? Bisogna usare qlc accorgimento particolare per la Notify visto che sono in rete??

    Se necessario vi posso postare il codice (č abb breve).

    PS=Per semplicita suppongo che ci siano solo due client
    "Vivi come se dovessi morire domani, pensa come se nn dovessi morire mai"

    "Solo i coraggiosi arrivano lā dove neanche gli angeli riescono a volare"

  2. #2
    Non c'e' proprio nessuno ke puoi aiutarmi??
    magari anche un link di approfondimento o un forum dedicato...
    Mi sarebbe molto utile

    Come gia scritto, se necessario posso postare il codice
    "Vivi come se dovessi morire domani, pensa come se nn dovessi morire mai"

    "Solo i coraggiosi arrivano lā dove neanche gli angeli riescono a volare"

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Credo che sia necessario postare il codice, cosė da capire bene qual č la situazione e come hai gestito la mutua esclusione fra i thread.


    Ciao.
    "Perchč spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4

    Ecco il codice

    Codice di Hello.java, la classe che poi carico nel RMIRegistry:
    NON fate caso a regCli: č x la gestione del numero di client, x ora disattivato, suppongo di avere solo due client.

    package helloWorld;

    import java.net.MalformedURLException;
    import java.rmi.Naming;
    import java.rmi.NotBoundException;
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;


    import helloWorld.interfaces.HelloInterface;

    /**
    * TODO To change the template for this generated type comment go to
    * Window - Preferences - Java - Code Style - Code Templates
    */
    public class Hello extends UnicastRemoteObject implements HelloInterface{

    private String msg = "Hello World!";
    private int cont=0; //Indica quanti client devono ankora leggere il messaggio
    private int tot=1; //Numero totale di client connessi


    /**
    * @throws RemoteException
    */
    protected Hello() throws RemoteException {
    super();
    }

    /* (non-Javadoc)
    * @see helloWorld.interfaces.HelloInterface#say()
    */
    public void regCl() throws RemoteException{
    tot++;
    System.out.println("Un nuovo client si č registrato, client connessi: "+tot); //Avviso sul server
    }


    public String say() throws RemoteException {
    return msg;
    }

    public void setMsg(String input) throws RemoteException {
    msg=input;
    // System.out.println("msg: "+msg); Stampo su server il valore inserito
    }

    public synchronized void setCont() throws RemoteException {
    cont=tot;
    }

    public synchronized void decCont() throws RemoteException {
    cont--;
    }

    public int getCont() throws RemoteException {
    return cont;
    }



    //--------THREADS----------------


    //Thread di scrittura del messaggio
    public static class ThreadScrittura extends Thread{

    HelloInterface hello;

    public ThreadScrittura(HelloInterface hello)
    {
    this.hello=hello;
    }

    public synchronized void scrivi(){

    try{

    System.out.println("scrivi -Cont:"+ hello.getCont());
    while(hello.getCont()>0) //Finke pieno aspetto
    {
    try {
    System.out.println("Aspetto a scrivere "+hello.getCont());

    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    ConsoleReader cr=new ConsoleReader(System.in);
    System.out.print(">> ");
    String txt=cr.readLine();


    hello.setMsg(txt);
    hello.setCont(); //ho messo un nuovo mex
    notifyAll();
    System.out.println("notify dello scrivi eseguita");
    }catch (RemoteException e) {
    e.printStackTrace();
    System.out.println("Eccezione remota");
    System.exit(1);
    }

    }

    public void run()
    {

    while(true)
    {
    scrivi();
    }
    }
    }

    //Thread di lettura del messaggio
    public static class ThreadLettura extends Thread{
    HelloInterface hello;

    public ThreadLettura(HelloInterface hello)
    {
    this.hello=hello;
    }

    public synchronized void leggi(){
    try{
    System.out.println("leggi-Cont:"+hello.getCont() );
    while(hello.getCont()<=0)//Finke vuoto aspetto
    {
    try {
    System.out.println("Sto aspettando a leggere "+hello.getCont());
    wait();

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

    }
    String msg=hello.say(); //Ottengo il messaggio
    System.out.println("--"+msg);
    hello.decCont(); //Messaggio vuoto
    System.out.println(hello.getCont());


    }catch (RemoteException e) {
    e.printStackTrace();
    System.out.println("Eccezione remota");
    System.exit(1);
    }
    notifyAll();
    System.out.println("notify del leggi eseguita");
    }

    public void run()
    {
    while(true)
    {
    leggi();
    }

    }
    }
    }

    Questo invece č il codice del Client (HelloClient):
    package helloWorld;

    import java.net.MalformedURLException;
    import java.rmi.Naming;
    import java.rmi.NotBoundException;
    import java.rmi.RemoteException;

    import helloWorld.Hello.ThreadLettura;
    import helloWorld.Hello.ThreadScrittura;
    import helloWorld.interfaces.HelloInterface;

    /**
    *
    *
    * TODO To change the template for this generated type comment go to
    * Window - Preferences - Java - Code Style - Code Templates
    */


    public class HelloClient {



    // Main /////////////////////////
    public static void main (String[] argv) {
    System.out.println("Estrazione del riferimento remoto...");
    try {
    HelloInterface hello = (HelloInterface) Naming.lookup("//localhost/Hello");

    //Creo i due thread: uno di lettura e una di scrittura:

    ThreadLettura leggi=new ThreadLettura(hello);
    ThreadScrittura scrivi=new ThreadScrittura(hello);

    //hello.regCl();
    scrivi.start();
    leggi.start();
    /*
    //Stampo a video il valore di msg
    System.out.println(hello.say());

    //Acquisisco e salvo il nuovo valore di msg
    System.out.println("Stringa: ");
    String input="";
    ConsoleReader cs=new ConsoleReader(System.in);
    input=cs.readLine();
    hello.setMsg(input);*/

    } catch (MalformedURLException e) {
    e.printStackTrace();
    System.out.println("URL errata");
    System.exit(1);
    } catch (RemoteException e) {
    e.printStackTrace();
    System.out.println("Eccezione remota");
    System.exit(1);
    } catch (NotBoundException e) {
    e.printStackTrace();
    System.out.println("Impossibile effettuare il binding all'oggetto remoto");
    System.exit(1);
    }

    }
    }
    Tralascio il codice del server.. in quanto non fondamentale.
    Sarō veramente grato se qualcuno riuscirā ad aiutarmi!!!
    Buona serata
    "Vivi come se dovessi morire domani, pensa come se nn dovessi morire mai"

    "Solo i coraggiosi arrivano lā dove neanche gli angeli riescono a volare"

  5. #5
    Neanche postando il codice qualcuno puo aiutarmi???
    "Vivi come se dovessi morire domani, pensa come se nn dovessi morire mai"

    "Solo i coraggiosi arrivano lā dove neanche gli angeli riescono a volare"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.