Java线程内部线程之间的通信
我不知道如何解决这个问题,希望你能帮助我 在服务器端后面,我有:Java线程内部线程之间的通信,java,multithreading,communication,Java,Multithreading,Communication,我不知道如何解决这个问题,希望你能帮助我 在服务器端后面,我有: 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();
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
看看我做了什么
我在Baza0类中创建了一个静态变量:
static Baza0 baza1;
在main方法中,我启动了一个Baza0对象:
Baza0 baza0 = new Baza0();
在此之后,运行使baza1=baza0的方法
现在,通过客户端处理程序,我可以通过以下方式访问该方法:
Baza0.baza1.method1(param);
它确实有用不知道为什么
已同步的块,在该块中发生列表的“事务”
已同步的块,在该块中发生列表的“事务”
您的客户端线程必须直接或(更好)间接引用该
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");
}
}
创建客户端
线程时,只需传递此
:
new Thread(new Client(this)).start();
重要的线程安全问题:
method1()
必须同步,或者您的ArrayList
必须是线程安全的。您的客户端线程必须直接或(更好)间接引用该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");
}
}
创建客户端
线程时,只需传递此
:
new Thread(new Client(this)).start();
重要的线程安全问题:
method1()
必须同步,或者您的ArrayList
必须是线程安全的。将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();
}
将
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();
}
我会说@Marko Topolnik说的话。我还有一本书(现在没有回应我):-()或者是一个让我在博客中找到这本书的链接,用来处理线程问题。这本书有所有队列的例子,并发的,同步的列表,实现代码做一些事情的方法,等等,所有这些都非常简单,每个主题都有一个例子和几个段落。我想说@Marko Topolnik说的话。我还有一本书(现在没有回应我:-()或者是一个链接,让我在博客中找到了这本书,是关于处理线程问题的。这本书有所有队列的例子,并发的,同步的列表,实现代码做一些事情的方法,等等,所有这些都非常简单,每个主题都有一个例子和几段。接受吗?请发布原始代码对不起,我不能,因为code不是我的。接受()等待客户端连接,当超时值变为null时,当超时值变为null时,它将充满来自socketserver的内容。是的,所有的编译和arraylist支持都非常强大-library manager。客户端可以连接和传输字符串通信。Hmmm。我甚至在中找不到名为
accept
的方法。此外,在n在初始化之前它本身?也许我在一个周末的早上没有清楚地思考,Socket
是什么,ServerSocket
是其他什么东西。要么你或者你的老师不知道你在说什么。Socket中没有接受的方法。好吧,你发布的代码是一团乱麻,它永远不会被接受le没有大的修改。为什么不发布原始代码,或者发布一些与原始代码足够相似的东西来说明您的问题并进行编译?s=s.accept?请发布原始代码抱歉,我不能,因为代码不是我的。accept()等待客户端连接,当超时值变为null时,当超时值变为null时,它将充满来自socketserver的内容。是的,所有的编译和arraylist支持都非常强大-library manager。客户端可以连接和传输字符串通信。Hmmm。我甚至在中找不到名为accept
的方法。此外,在n在初始化之前它本身?也许我在一个周末的早上没有清楚地思考,Socket
是什么,ServerSocket
是其他什么东西。要么你或者你的老师不知道你在说什么。Socket中没有接受的方法。好吧,你发布的代码是一团乱麻,它永远不会被接受你为什么不发布原始代码,或者发布一些与原始代码足够相似的东西,以显示你的问题并进行编译?客户端可以添加、删除、读取新元素,但我认为它的工作原理是:我以“$param1$param2$param3”的格式从客户端发送字符串服务器上的.client handler将参数剪切为单个字符串,现在应该运行该方法。与reading相同,但客户端handler需要从somwehere获取Baza0中方法的结果。客户端可以添加、删除、读取新元素,但我认为其工作原理类似:我正在以“$param1$param2$param3”格式从客户端发送字符串.服务器上的客户端处理程序将参数剪切为单个