0

我想要一个线程来更新其他类中的变量。

说,我有一个整数和一个线程类,它有一个 Socket 获取一个值,我希望将该值设置为我的整数。

我有一个名为 direction 的枚举,它的值是 UP,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;
    }

}

我希望主类中的方向变量从线程类更新

4

2 回答 2

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

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

于 2012-12-13T14:47:34.767 回答
1

根据您发布的代码,您实际上不需要做任何事情,只需读取变量(因为它在服务器中是易失的):

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

//when you need it:

Direction dir = server.getDirection();

现在,如果您的问题是:我可以主要获取dirServer 对象的各种值,您可以使用BlockingQueue例如来处理通信。在您的 Server 类中,声明队列(并删除dir成员):

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

然后在你的运行方法中:

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 命名约定。

于 2012-12-13T15:06:55.130 回答