我希望能解决Java中的关键部分问题。第一个过程进入无限循环,这应该以状态之间的控制变化结束,这导致转向变量被重置。但第二个线程似乎没有完成它的工作。任何人都可以告诉我为什么以及如何解决它?
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
class ty{
class Control{
public volatile AtomicBoolean turn=new AtomicBoolean();
}
final Control control=new Control();
}
class newthread implements Runnable{
Thread g;
ty t=new ty();
newthread(){
g=new Thread(this,"hello");
g.start();
}
@Override
public synchronized void run(){
while ((t.control.turn).get()==false){
try {
g.sleep(2000);
}
catch (InterruptedException ex) {
Logger.getLogger(newthread.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("process "+t.control.turn+"is executing");
}
System.out.println("process "+ t.control.turn+ " is executing");
(t.control.turn).compareAndSet(false, true);
}
}
class newthreadt implements Runnable{
Thread g;
ty t=new ty();
newthreadt(){
g=new Thread(this,"hello1");
g.start();
}
@Override
public synchronized void run(){
while ((t.control.turn).get()==true){
try {
g.sleep(1000);
} catch (InterruptedException ex){
Logger.getLogger(newthreadt.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("process "+t.control.turn+"is executing");
}
System.out.println("process "+t.control.turn+"is executing");
(t.control.turn).compareAndSet(true, false);
}
}
public class JavaApplication2 {
public static void main(String[] args){
int turn=0;
newthread f;
newthreadt g;
new newthread();
new newthreadt();
}
}
答案 0 :(得分:1)
你不需要做你正在做的事情的一半,但你真正需要做的一件事就是分享控制权。目前,每个线程都创建了自己的Control,这意味着线程没有交互。
因此,在格式化代码并删除一半不需要的代码之后,分享AtomicBoolean就更接近工作了。