2012-12-13 58 views
0

我想有一个线程将更新其他类中的变量。Java使线程更新变量

说,我有一个整数,和一个线程类有一个套接字获取值,我希望该值设置为我的整数。

我都设有ENUM称为方向,其中,最多有值,DOWN 我有具有可变方向 在该主类,我开始拥有一个插座在它 螺纹外观线程主类像:

import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server extends Thread { 
    private ServerSocket serverSocket; 
    DataInputStream in; 
    volatile direction dir; 
    public Server(int port,direction d) throws IOException { 
     serverSocket = new ServerSocket(port); 
     Socket server = serverSocket.accept(); 
     in = new DataInputStream(server.getInputStream()); 
     dir=d; 
    } 
    public void run() { 
     int recieved; 
     while (true) { 
      try { 
       recieved = in.readInt(); 
       while (recieved != -1) { 
        dir = direction.fromInt(recieved); 
        recieved = in.readInt(); 
        System.out.println(dir); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
    public direction getDirection() { 
     return dir; 
    } 

} 

我想在主类的方向变量从Thread类

+4

你有什么试过?什么没有奏效?持有整数的类的代码是什么样的?换句话说:你需要更具体。 – assylias

回答

1
Socket socket = new Socket("myhost", myport); 
DataInputStream dis = new DataInputStream(socket.getInputStream()); 
// read your value 
int val = dis.readInt(); 
myClass.setValue(val); 

在你的类更新,使用挥发性整数。

private volatile int value; 

public void setValue(int val) 
{ 
    value = val; 
} 

确保线程有一个指向您的类实例的指针。例如,使用构造函数执行此操作。

+0

谢谢,但我的插座实际上是在线程中... – aclokay

+0

这并不重要。根据我在这里写的内容,尝试一些东西。只要确保线程有一个指向你的类的指针。 –

+0

我编辑了我的问题,可以看看课程? – aclokay

1

根据您发布的代码,你不需要做任何事情真的,只是读取该变量(因为它是挥发性的服务器):

Server server = new Server(...); 
server.start(); 

//when you need it: 

Direction dir = server.getDirection(); 

现在,如果你的问题是:我可以主要获取dir的各种值,因为他们来到服务器对象,例如可以使用BlockingQueue来处理通信。在您的服务器类,申报队列(和删除dir成员):

private BlockingQueue<Direction> queue = new LinkedBlockingQueue<Direction>(); 

然后在您的run方法:

Direction dir = Direction.fromInt(recieved); 
queue.put(dir); 

和你getDirection方法可以改名getNextDirection

public Direction getNextDirection() throws InterruptedException { 
    queue.take(); 
} 

你的主要可能看起来像这样:

while (true) { 
    Direction nextDirection = server.getNextDirection() 
    //do something with the new direction 
} 

注意:我已将您的枚举Direction而不是direction更名为尊重Java命名约定。

+0

由于某种原因,我尝试将套接字连接到端口80 ......但是当我更改端口时,它工作正常!谢谢! – aclokay