2014-10-09 101 views
0

我有3個類1.主2.主3.客戶(三個實例)。主服務器和客戶端有一個函數增量,它們保持遞增值,並且定期客戶端(比如每2秒)將該增量值發送給主服務器,並且隨機時間每個客戶端應該隨機發送消息給其他客戶端(比如client1發送給客戶端2)。當maser收到消息時,它會做一些計算並將價值廣播給所有消費者。線程之間如何通信

主要-------->

public class Sample_one{ 

public static final int PORT = 4444; 
public static void main(String[] args) throws IOException{ 


ServerSocket server = new ServerSocket(PORT); 
Socket socket =server.accept(); 

Thread m1= new Master(socket); 
m1.start(); 


Client c1 = new Client(); 
Client c2 = new Client(); 
Client c3 = new Client(); 
c1.start(); 
c2.start(); 
c3.start(); 

} 
} 

大師----->

公共類碩士繼承Thread {

private int inc= 0; 
long start = System.currentTimeMillis(); 
long end = start + 10*1000; 
Socket socket; 

Master(Socket socket){ 
    this.socket = socket; 
} 

@Override 

public void run() { 

    while(System.currentTimeMillis() < end){ 
     increment(); 

    //Method to read input from the client 

     } 

} 

private void increment(){ 
    inc++; 
    System.out.println("counter"+ inc); 
} 

} 

客戶端 - >

public class Client extends Thread { 

    private int inc= 0; 
    long start = System.currentTimeMillis(); 
    long end = start + 10*1000; 

    public void run() { 

    while(System.currentTimeMillis() < end){ 
     increment(); 

    //Method to send the value to the Master or other clients 


     } 

     } 

    private void increment(){ 
    inc++; 
    System.out.println("counter"+ inc); 
    } 

    } 

我在當前路徑??我如何連接主客戶端和客戶端與其他客戶端?是否Socket是唯一的方法?我是新的主題。

+1

線程之間的通信是完成/討論當線程在同一進程中。套接字用於機器間通信(通常)。你在哪一類?你將兩者混合在一起。 – SingleStepper 2014-10-09 20:41:30

+0

我只需要在一臺機器上模擬這個 – 2014-10-09 20:44:36

+1

聲音太複雜了,對我來說這代表糟糕的設計。我可以看到客戶與主人溝通,但他們爲什麼要互相交談?理想情況下,您希望線程儘可能地獨立,並且可能只共享一些數據,而不是在它們之間來回發送消息。 – ventsyv 2014-10-09 20:46:26

回答

0

可能最好的事情是使用管道。例如,查看PipedInputStream和PipedOutputStream類。一旦你打開管道,接收數據,你會做這樣的事情:

//establish the pipe connection 

while (pipe) //assuming someone will eventually close the connection 
{ 
    while (pipe.available() > 0) 
     buffer.addByte(pipe.read()) 

    //Do some other processing 
}