1

我不知道如何解决这个问题,希望你能帮助我。

在服务器端我有这个:

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

连接的客户端通过 socketserver 功能将字符串发送到客户端处理程序。如何将此字符串从客户端处理程序发送到 method1 作为参数?它必须使用唯一的一个 Baza0 对象,因为 ArrayList 必须对所有客户端通用。

编辑

有人能告诉我为什么像 Baza0.baza0.method1() 这样的东西不起作用吗?

编辑2

看看我做了什么!

我在 Class Baza0 中创建了一个静态变量:

static Baza0 baza1;

在 main 方法中,我启动了一个 Baza0 对象:

Baza0 baza0 = new Baza0();

在此之后运行使 baza1 = baza0 的方法。

现在从客户端处理程序我可以访问方法,通过:

Baza0.baza1.method1(param);

它确实有效!:D ...不知道为什么。

4

4 回答 4

2
  1. 如果您仅将 arraylist 用于读取,则所有子线程都可以自由地同时访问它;
  2. 如果线程想要修改列表,那么列表必须是线程安全的;
  3. 如果修改涉及许多步骤(读取和写入),那么您必须使用synchronized与列表发生“事务”的块。
于 2013-01-19T16:14:16.407 回答
1

您的客户端线程必须ArrayList直接或(更好)间接地引用它。最简单的方法是将Baza0实例 ( this) 传递给客户端线程:

public class Client implements Runnable {

    private final Baza0 baza;

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

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

}

当您创建Client线程时,只需传递this

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

重要的线程安全问题:method1()必须同步或您ArrayList必须是线程安全的。

于 2013-01-19T16:15:49.323 回答
1

传递Baza0对可用于调用的客户端处理程序线程的引用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(...);
  }
}
于 2013-01-19T16:17:20.623 回答
1

我会说@Marko Topolnik 所说的。我还有一本书Java Concurrency In Practice(现在没有回复我:-() 或一个链接让我找到这本书,在博客The Java Specialists for processing thread issues 中。这本书有所有队列的例子,并发,同步列表,实现代码以做几件事的方法等,所有这些都非常简单,每个主题的示例和几段。

于 2013-01-19T17:18:06.730 回答