如何访问 class(implements Runnable) 字段
How to access class(implements Runnable) field
我想通过输入值控制线程。
如果输入值为 1 则执行某些操作。
其他没有。
class Main {
class test implements Runnable{
public boolean flag = true;
public int val = 0;
@Override
public void run(){
while(true){
if(flag == true){
pt();
}
}
}
public void pt(){
System.out.println(val++);
flag = false;
}
}
public static void main(String[] args) {
Main m = new Main();
test r = m.new test();
Thread t = new Thread(r);
t.start();
Scanner reader = new Scanner(System.in);
while(true){
int n = reader.nextInt();
if(n==1){
r.flag = true;
// t.flag = true;
}
else{
r.flag = false;
// t.flag = false;
}
}
}
}
这是我的代码。
显然,
我知道 r.flag 不会改变 Thread t 的值。
所以,即使输入 1,也没有任何反应。
但是 t.flag 是不可能的。对象 t 没有变量标志。
如何访问t.r.flag ....你能看懂吗?
我认为现在有很多事情让很多人傻了。
我走错方向了吗?
简答:
将public boolean flag = true;
更改为public volatile boolean flag = true;
JVM 通过缓存 flag 的值优化了代码,因为 'obvious' 它会被更改。
我想通过输入值控制线程。
如果输入值为 1 则执行某些操作。
其他没有。
class Main {
class test implements Runnable{
public boolean flag = true;
public int val = 0;
@Override
public void run(){
while(true){
if(flag == true){
pt();
}
}
}
public void pt(){
System.out.println(val++);
flag = false;
}
}
public static void main(String[] args) {
Main m = new Main();
test r = m.new test();
Thread t = new Thread(r);
t.start();
Scanner reader = new Scanner(System.in);
while(true){
int n = reader.nextInt();
if(n==1){
r.flag = true;
// t.flag = true;
}
else{
r.flag = false;
// t.flag = false;
}
}
}
}
这是我的代码。
显然, 我知道 r.flag 不会改变 Thread t 的值。 所以,即使输入 1,也没有任何反应。 但是 t.flag 是不可能的。对象 t 没有变量标志。
如何访问t.r.flag ....你能看懂吗?
我认为现在有很多事情让很多人傻了。
我走错方向了吗?
简答:
将public boolean flag = true;
更改为public volatile boolean flag = true;
JVM 通过缓存 flag 的值优化了代码,因为 'obvious' 它会被更改。