如何在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()
的值,但我可以访问其他常规方法。
答案 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;
}
}