public class Machine implements Runnable {
        private int a = 1;
        
        public void run(){
        for(int i=0;i<10;i++) {
             synchronized(this) {
             a = a+i;
             try{
            Thread.sleep(500);
             }catch(InterruptedException e){
            e.printStackTrace();
             }
             a = a-i;
             System.out.println(Thread.currentThread().getName()+" : "+a);
        }
    }
}
        
        public void go() {
        for(int i=0;i<10;i++) {
            System.out.println(Thread.currentThread().getName()+" : "+i);
            Thread.yield();
            }
        }
        
        public static void main(String[] args){
                Machine machine = new Machine();
                Thread t1 = new Thread(machine);
                Thread t2 = new Thread(machine);
                t1.start();
                t2.start();
                machine.go();
        }
}上例的输出结果是: 
main:0 
main:1 
main:2 
main:3 
main:4 
main:5 
main:6 
main:7 
main:8 
main:9 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
Thread-0:1 
Thread-1:1 
为什么输出的结果是这个样子呢?为什么不是main主线程,t1,t2,轮流输出呢?在上例中红色标注的:Thread.yield()好像并没有起作用?请问这是为什么啊?为什么结果不会有这种可能呢?(多次执行,结果都一样,而且把go()方法中的i改成10000,还是这种结果) 
main:0 
Thread-0:1 
Thread-0:1 
Thread-1:1 
Thread-1:1 
Thread-1:1 
Thread-1:1 
Thread-0:1 
main:1 
Thread-0:1 
Thread-0:1 
main:2还有一个问题: 
在生产者-消费者问题中,notify()方法是随机唤醒对象的等待池中的一个线程,但是等待池中既有生产者也有消费者线程,那它是有可能唤醒生产者线程,也有可能唤醒消费者线程吗? 
谢谢各位了,在线等~!

解决方案 »

  1.   

    在多线程的程序中,为了防止某个线程独占CPU资源,把让当前执行的线程yield一下,但是这并不能保证下一个运行的线程不是该线程。
    如果把Thread.yield();换成try{
                Thread.sleep(500);
                 }catch(InterruptedException e){
                e.printStackTrace();
                 }
    ,就会交替打印,但是也不是很有规律的交替
      

  2.   

    生产者-消费者模型:开辟一个缓存区,比如一维数组array。
    定一个游戏规则:生产者始终从一端开始放东西,消费者始终从另一端开始取东西。1.只要array中有空余位置,生产者就可以往array中放东西,否则只能等待array有空余位置。
    2.只要array中有东西,消费者就可以取,否则只能等待array中有东西。
    3.生产者和消费者不能同时操作array。