黑马程序员技术交流社区
标题:
多线程问题,本来想帮论坛里一哥们解决问题来着,结果把自己绕进去了
[打印本页]
作者:
伊文龙
时间:
2012-6-13 19:11
标题:
多线程问题,本来想帮论坛里一哥们解决问题来着,结果把自己绕进去了
先把代码贴出来
package cn.ywl.extendsdemos;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockDemo {
public static void main(String[] args) {
Lockc ck = new Lockc();
producer p = new producer(ck);
consumer c = new consumer(ck);
Thread t1 = new Thread(p);
Thread t2 = new Thread(p);
Thread t3 = new Thread(c);
Thread t4 = new Thread(c);
t4.start();
t2.start();
t3.start();
t1.start();
}
}
class Lockc {
private String name;
public int cuu = 1;
private boolean o = false;
Lock kk = new ReentrantLock();
Condition ll_1 = kk.newCondition();
Condition ll_2 = kk.newCondition();
public void set(String name) throws InterruptedException {
System.out.println(Thread.currentThread().getName()+"set run!!");
kk.lock();
while (o)
try {
System.out.println("set ..... try");
ll_1.await(); // t1 t2
this.name = name + "....." + cuu++;
System.out.println("生产者...................." + this.name+ "..........");
o = true;
ll_2.signal();
} finally {
System.out.println("set .....finally!");
kk.unlock();
}
System.out.println("set over!!!");
}
public void out() throws InterruptedException { //如果操作这段代码的线程第一个抢到CPU,那么这里就会执行一次
System.out.println("out run!!!");
kk.lock();
while (!o)
try {
System.out.println(".....");
ll_2.await(); // t3 t4 //!o = true,线程直接 wait了。
System.out.println("消费者" + "...........");
o = false;
ll_1.signal();
} finally {
System.out.println("unlock!!!");
kk.unlock(); //能执行到try里面,当然也能执行到finally里面
}
System.out.println("set over!!!");
}
}
class producer implements Runnable {
private Lockc lo;
producer(Lockc lo) {
this.lo = lo;
}
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
// if(lo.cuu>0)
try {
lo.set("++商品++");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class consumer implements Runnable {
private Lockc lo;
consumer(Lockc lo) {
this.lo = lo;
}
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
try {
lo.out();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
运行几秒的结果:
out run!!!
.....
Thread-1set run!!
set over!!!
out run!!!
Thread-0set run!!
Thread-1set run!!
set over!!!
Thread-1set run!!
set over!!!
Thread-1set run!!
set over!!!
*/
复制代码
关于lock()方法,API中有这样一句:如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。
在我这段代码中,第一个拿到kk锁的是消费者线程,为什么生产者线程还可以使用kk.lock();?
难道API中说的禁用当前线程是指的前面获取kk锁的消费者线程?不应该啊。
求解释........
作者:
伊文龙
时间:
2012-6-13 19:40
{:soso_e150:}求解释.......
作者:
伊文龙
时间:
2012-6-14 00:25
帖子马上要沉了。。。自己顶起来。求解释{:soso_e149:}
作者:
孙峰
时间:
2012-6-14 01:12
多线程通信的问题,当一个线程处于睡眠或wait状态时,就会放弃执行资格,同时就释放锁,那么醒着的线程就能拿到锁,并执行了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2