如何在Thread中的run()方法中访问公共布尔变量

时间:2013-07-10 13:51:25

标签: java multithreading

如何在boolean方法中访问变量check_point run()

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_point run()的值,但我可以访问其他常规方法。

3 个答案:

答案 0 :(得分: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; 
   }
  }
}

另一个例子here

答案 1 :(得分:2)

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

答案 2 :(得分:1)

的原因是您无法访问代码中的check_point公共字段,原因是您永远不会在你的while循环条件中引用它。我假设您将check_point设置为false后,期望循环结束。但是,你永远不会在循环条件中引用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;
    }
}