[英]Communication between thread inside a thread Java
我不知道該如何解決這個問題,希望您能幫助我。
在服務器端后面,我有這個:
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);
}
}
連接的客戶端通過套接字服務器功能將字符串發送到客戶端處理程序。 我如何將此字符串從客戶端處理程序發送到method1作為參數? 它必須僅使用一個Baza0對象,因為ArrayList對於所有客戶端都必須是公共的。
有人可以告訴我為什么Baza0.baza0.method1()之類的東西不起作用嗎?
看看我做了什么!
我在Baza0類中創建了一個靜態變量:
static Baza0 baza1;
在主要方法中,我啟動了一個Baza0對象:
Baza0 baza0 = new Baza0();
在此運行之后,使baza1 = baza0的方法。
現在從客戶端處理程序,我可以通過以下方式訪問方法:
Baza0.baza1.method1(param);
確實有效! :D ...不知道為什么。
synchronized
塊,在該synchronized
塊中會發生與列表的“事務”。 您的客戶端線程必須直接或(更好地)間接引用該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
必須是線程安全的。
將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(...);
}
}
我會說@Marko Topolnik說的。 另外,我在《處理線程問題的Java專家 》博客中有一本書《 Java Concurrency In Practice》 (目前沒有對我做出回應:-()或導致我找到該書的鏈接)。該書包含了所有隊列的示例,並發,同步列表,實現代碼以完成多項任務的方式等,所有這些都非常簡單明了,每個主題的示例和幾段內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.