0

私は単にメッセージを別のオブジェクトに送信しようとしていますが、重要な要素が欠けていない限り、正確には変化しません。数値を設定するクラスと取得する別のクラスがあります。取得するクラスは、設定されている正しい数値に依存しますが、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

4 に答える 4

1

Probably they both do not use the same Close object.

Close close = new Close();

Then make sure that both use the same close object!

If that is not possible, field close can be made static:

  public class Close {
static int close;
于 2012-12-07T01:12:26.720 に答える
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;


  }
于 2012-12-07T01:09:07.093 に答える
0

試す...

static int close = 1;

このようにして、Close クラスのすべてのインスタンスに対して、int クローズのコピーが 1 つだけ存在します。このクラスを使用するコードを追加すると役立ちます。操作ごとに新しいコピーをインスタンス化しているため、問題が発生していると思います。

于 2012-12-07T01:10:45.277 に答える
0

私はあなたの問題を本当に理解していません。このクラスをどのように使用しているかについて、少し抜粋していただけますか?

ただし、いわゆるクラス A および B から同じインスタンスにアクセスしていない可能性が非常に高いようです。

A が 1 枚の紙に何かを書いていて、B が別の紙を読んでいるようなものです。もちろん、A が書いたものは B には読めません。

于 2012-12-07T01:15:53.000 に答える