91名师指路-头部
91名师指路

lock知识复习

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750

题目:一个初始值为0的变量,两个线程交替操作,一个加1 一个减1循环5次


代码如下:

package com.mszl.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* 功能:线程通信之生产者消费者传统版:一个初始值为0的变量 两个线程交替操作 一个加1 一个减1循环5次
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
class resData{

public int number=0;
public Lock lk=new ReentrantLock();
public Condition ct=lk.newCondition();

public void add(){
lk.lock();
try{
while(number != 0){ // 等于0时才开始+1,不等于0时一直等待
ct.await();
}
number++;
System.out.println(Thread.currentThread().getName() + "\t" + number);
ct.signalAll();
} catch(Exception ex){
ex.printStackTrace();
} finally{
lk.unlock();
}
}

public void del(){
lk.lock();
try{
while(number == 0){ // 不等于0时才开始-1,等于0时一直等待
ct.await();
}
number--;
System.out.println(Thread.currentThread().getName() + "\t" + number);
ct.signalAll();
} catch(Exception ex){
ex.printStackTrace();
} finally{
lk.unlock();
}
}

}

public class ProduceConsumeDemo {

public static void main(String[] args) {
resData rd=new resData();

Thread t1=new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=5; i++) {
rd.add();
}
}
});
t1.start();

Thread t2=new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=5; i++) {
rd.del();
}
}
});
t2.start();
}


}


执行结果:

Thread-0	1
Thread-1 0
Thread-0 1
Thread-1 0
Thread-0 1
Thread-1 0
Thread-0 1
Thread-1 0
Thread-0 1
Thread-1 0


2019-12-02 13:29:58     阅读(845)

名师出品,必属精品    https://www.91mszl.com

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部