设置和获取方法不按计划工作

时间:2012-12-07 01:05:35

标签: java multithreading get set

我只是试图向另一个对象发送消息,但它并没有完全改变,除非我错过了一个重要的因素。我有一个类来设置数字和另一个获取的类,获取的类依赖于正确设置的数字,但是虽然set方法返回0一个命令行,另一个对象在使用get方法时返回1。这是关闭类,它包含两种方法,每个方法都从类A和类B中调用

public class Close {
    static int close =1;

    public synchronized void setClose(int x, Client)
    {
        /*
        while(turn !=0){
            try{
                wait();

            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }*/
        close = x;
        System.out.println("set "+close);
    }

    public synchronized int getClose(ClientHandeler)
    {
        int x;
        /*
        while(turn==0){
            try{
                wait();
            }catch(Exception e)
            }
        }*/
        System.out.println("get "+close);
        x = close;
        return x;
    }

}

这是我希望从

获取近似整数的处理程序类
import java.io.*;
import java.net.*;
import java.util.*;

public class ClientHandler implements Runnable {

private BufferedReader reader;
private Socket sock;//refering to socket class
//listens for the socket
private Server server; // call-back reference to transmit message to all clients
Client c = new Client();

public ClientHandler(Socket clientSocket, Server serv) {

    try {
            sock = clientSocket;
            server = serv;

            InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
            reader = new BufferedReader(isReader);



     } catch (Exception ex) {
         ex.printStackTrace();
     }
}

public void run() {

    String message;




    try {

         int x = c.c.getClose(this);
         while(x!=0){
         x = c.c.getClose(this);//calls client and within client there is the close 
            System.out.println(x);

            Thread ct= Thread.currentThread();
            ct.sleep(3000);
            while ((message = reader.readLine()) != null) {

                System.out.println("read " + message);

                server.tellEveryone(message);
            }
        }       
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}





}

4 个答案:

答案 0 :(得分:1)

可能他们都不使用相同的Close对象。

Close close = new Close();

然后确保两者都使用相同的近物!

如果无法做到,可以将字段关闭设为静态:

  public class Close {
static int close;

答案 1 :(得分:0)

您可以使用AtomicInteger。

public class Close {
AtomicInteger close = new AtomicInteger(1);

public void setClose(int x)
{
    /*
    while(turn !=0){
    try{
        wait();

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }*/

    close.set(x);
    System.out.println("set "+close.get());   
}
public int getClose()
{
    int x;
    /*
    while(turn==0){
        try{
            wait();
        }catch(Exception e)
    }*/
    System.out.println("get "+close.get());
    x = close.get();
    return x;


  }

答案 2 :(得分:0)

...试

static int close = 1;

这样,对于Close类的所有实例,只会有一个int close副本。添加使用此类的代码会有所帮助,我猜你正在为每个操作实例化新副本,这会导致你的问题。

答案 3 :(得分:0)

我真的不明白你的问题。你可以给一些关于你如何使用这个课程的片段吗?

但是,您很可能不会从所谓的A类和B类访问同一个实例。

就像A在一张纸上写东西一样,B正在读另一张纸。当然,A写的东西不能被B读取。