Vilo
Vilo

Reputation: 152

Communication between thread inside a thread Java

I don't know how to solve this problem I hope that you can help me.

Behind Server side I have this:

class Baza0 implements Runnable{  

     anotherclass arraylist_handle = new anotherclass();

public method1(string s1){uses methods figured in arraylist_handle)

public run(){
  while(true){
   Socket s = s.accept();
   if(s==NULL) continue;
   
   //there I'm starting another thread that handles client  connection
  }   
}
 public static void main(){
   Baza0 baza0 = new Baza0();
   Thread t = new Thread(baza0); 
 }
}

Connected clients sends Strings by socketserver feature to client handler. How can I send this string from client handler to the method1 as parameter? It must use the only one Baza0 object, because of the ArrayList that must be common for all the clients.

EDIT

can someone tell me why something like Baza0.baza0.method1() won't work?

EDIT2

Look what I did!

I've made in Class Baza0 an static variable:

static Baza0 baza1;

and in main method I've started an Baza0 object:

Baza0 baza0 = new Baza0();

after this run the method that makes baza1 = baza0.

now from client handler I have access to method, by:

Baza0.baza1.method1(param);

It does work! :D ...don't know why.

Upvotes: 1

Views: 221

Answers (4)

Pedro R.
Pedro R.

Reputation: 142

I'd say what @Marko Topolnik said. Also I have a book Java Concurrency In Practice (that right now is not responding to me :-() or a link that led me to the book, in the blog The Java Specialists for handling thread issues. The book has examples of all queues, concurrent, synchronized lists, ways to implement code to do several things, etc, and all pretty straight forward, an example and a few paragraphs of every subject.

Upvotes: 1

Subhrajyoti Majumder
Subhrajyoti Majumder

Reputation: 41230

Pass a Baza0 reference to Client Handler thread which can be used for calling method1.

public method1(string s1){
    synchonized(arrayList){
        //list operation 
    }
}
...
while(true){
   Socket s = s.accept();
   if(s==NULL) continue;
   new Thread(
            new WorkerRunnable(
                clientSocket, this).start();

  }   

....

public class WorkerRunnable implements Runnable{
  public WorkerRunnable(Socket socket,Baza0 ba){
     this.socket = socket;
     this.baza =ba;
  }
  public void run(){
     ...
     this.ba.method1(...);
  }
}

Upvotes: 1

Tomasz Nurkiewicz
Tomasz Nurkiewicz

Reputation: 340973

Your client thread must have a reference to that ArrayList - directly or (better) indirectly. Simplest way to do this is to pass Baza0 instance (this) to the client thread:

public class Client implements Runnable {

    private final Baza0 baza;

    public Client(Baza0 baza) {
        this.baza = baza;
    }

    public void run() {
        //...
        baza.method1("Some string");
    }

}

When you create your Client thread simply pass this:

new Thread(new Client(this)).start();

Important thread safety issue: method1() has to be synchronized or your ArrayList must be thread-safe.

Upvotes: 1

Marko Topolnik
Marko Topolnik

Reputation: 200296

  1. If you are using the arraylist only for reading, then all the child threads are free to access it concurrently;
  2. if the threads want to modify the list, then the list must be thread-safe;
  3. if the modification involves many steps (reading and writing), then you must use synchronized blocks within which a "transaction" with the list happens.

Upvotes: 2

Related Questions