Java中使用线程的关键部分

时间:2013-08-20 18:11:09

标签: java multithreading

我希望能解决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();
    }
}

1 个答案:

答案 0 :(得分:1)

你不需要做你正在做的事情的一半,但你真正需要做的一件事就是分享控制权。目前,每个线程都创建了自己的Control,这意味着线程没有交互。

因此,在格式化代码并删除一半不需要的代码之后,分享AtomicBoolean就更接近工作了。