黑马程序员技术交流社区
标题:
多线程一问
[打印本页]
作者:
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