0

如何访问方法中的变量boolean check_pointrun()

public class Transciever {

public boolean check_point = true;

  public void run() {

                while (true) {

                         System.out.println("before client listening...");
                        socket = serverSocket.accept();
                        System.out.println("after socket accept");
                        check_point = false; 
   }
  }
}

我无法boolean check_pointrun()方法中更改变量的值,但我可以访问其他普通方法。

4

3 回答 3

3

我认为您正在尝试访问check_point线程外的方法。首先Transciever不是线程,因为您没有实现 runnable 方法。您需要一个 getter 方法才能让其他类能够获取标志,并且为了获取值线程实例不是必需的,您需要保留Transciever类实例,所以应该是这样的。

class Main{
 public static void main(String...arg){
  Transciever t=new Transciever();
  new Thread(t).start();
  //......
  //......
  boolean flag=t.getFlag();
 }
}

public class Transciever implements Runnable{
private volatile boolean check_point = true;
public boolean getFlag(){ return this.check_point;}
  @Override
  public void run() {
                while (true) {

                         System.out.println("before client listening...");
                        socket = serverSocket.accept();
                        System.out.println("after socket accept");
                        check_point = false; 
   }
  }
}

这里的另一个例子

于 2013-07-10T14:09:26.990 回答
2

我猜想更改 check_point 的值是您想要作为 while 循环的中断条件所做的事情,但是您永远不会退出 while 循环(while(true)是一个无限循环)。放while (check_point)出来摆脱循环!

于 2013-07-10T13:54:51.197 回答
1

在您看来,您无法访问check_point代码中的公共字段的原因是因为您从未在 while 循环条件中引用它。我假设您希望循环在设置check_pointfalse. 但是,您永远不会check_point在循环条件中引用!因此,即使check_point在声明之后最终是完全错误的,循环仍然会永远继续下去。

此外,您在代码中拼错了“收发器”。

你可能想要的是:

public class Transceiver implements Thread {

    public boolean check_point = true;

    @Override
    public void run() {
        while (check_point) { //loop condition changed
            ServerSocket serverSocket = // [...]
            Socket socket = serverSocket.accept();
            check_point = false;
        }
    }
}

另外,如果这是您的实际最终代码,我建议您改为这样做,根本不使用循环(您仍然可以保留该check_point字段,我假设其他类使用该字段来检查通信是否完成? :

public class Transceiver implements Thread {
    public boolean check_point = true;

    @Override
    public void run() {
        ServerSocket serverSocket = // [...]
        Socket socket = serverSocket.accept();
        check_point = false;
    }
}
于 2013-07-10T14:17:05.867 回答