黑马程序员技术交流社区

标题: 多线程一问 [打印本页]

作者: 18201432758s    时间: 2015-9-21 21:13
标题: 多线程一问
import java.util.concurrent.locks .*;
class Goods {
        String name ;                //成员属性
        int count = 1;
        boolean flag ;                // 标记,当成员属性被赋值前是false 赋值后为true
        Lock lock = new ReentrantLock();        //创建锁
        Condition a = lock.newCondition();        //创建Condtion
        Condition b = lock.newCondition();
        public void set(String name)throws InterruptedException{
                        lock.lock();        //线程枷锁同步
                        try {
                                while (true) {        // 循环判断标记
                                        while (flag){
                                                a.await();                //赋值一次都就让线程等待。
                                        }
                                        this.name = name ;                //g给成员变量 赋值,
                                        System.out.println("name="+name+"num="+count+++"xiancheng="+Thread.currentThread().getName());//赋值过后马上打印一次
                                        flag = true ;                        //改变标记
                                        b.signal();                                //叫醒Outport线程
                                }
                        }finally{
                                lock.unlock();                // 将锁释放
                        }
        }
        public void out()throws InterruptedException{
                lock.lock();
                        try {
                                while (true) {
                                        while (!flag) {
                                                b.await();
                                        }
                                        System.out.println("name="+name+"num="+count+"-----------xiangcheng="+Thread.currentThread().getName());
                                        flag = false ;
                                        a.signal();       
                                }
                        }finally{
                                lock.unlock();
                        }
        }
}
class Inport implements Runnable {
        Goods a ;
        Inport(Goods a ){
                this.a = a ;       
        }
        public void run(){
                try {
                        a.set("商品");
                }
                catch (InterruptedException e) {
                }
        }
}
class Outport implements Runnable{
        Goods a ;
        Outport(Goods a){
                this.a = a ;
        }
        public void run(){
                try {
                        a.out();
                }
                catch (InterruptedException e) {
                }
        }
}
class ShengChanDemo {
        public static void main(String[] args) {
                Goods a = new Goods();
                Inport b = new Inport(a);
                Outport c = new Outport(a);
                Thread d = new Thread(b);
                Thread e = new Thread(b);
                Thread f = new Thread(c);
                Thread g = new Thread(c);
                d.start();
                f.start();
                e.start();
                g.start();
        }
}



作者: 18201432758    时间: 2015-9-21 21:13
很明显啊,在Api 文档中写的清清粗粗 ,condition 的await()方法后,会以原子的方式释放锁,原话,这么写的,楼主程序好像有点问题,怎么是先输出线程运行后赋值线程开始呢,顺序没调整好吧,也可能是你num 没控制好吧,
作者: 18201432758s    时间: 2015-9-21 21:24
18201432758 发表于 2015-9-21 21:21
很明显啊,在Api 文档中写的清清粗粗 ,condition 的await()方法后,会以原子的方式释放锁,原话,这么写 ...

啊!居然没看到,确实文档时那么写的,我太粗心额。多个线程不容易控制啊,你说的问题我在看看吧,价格好友,以后有问题在问你吧
作者: sunsteam    时间: 2015-9-21 22:04
楼主这两个号的名字都一样 精分麽




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2