5.lock 锁
2024-08-22 14:05:35
中断: 线程实例.interrupt();
lock锁的使用
package com.jlong;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class User {
public String name;
public String sex;
public boolean flag = false;
public Lock lock = new ReentrantLock();
public Condition conditionLock = lock.newCondition();
}
class InputThread extends Thread {
private User user;
public InputThread(User user) {
this.user = user;
}
int cout = 0;
@Override
public void run() {
while (true) {
//加锁
user.lock.lock();
if (user.flag) {
try {
//线程等待
user.conditionLock.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
if (cout == 0) {
user.name = "jLong";
user.sex = "男";
} else {
user.name = "燕子";
user.sex = "女";
}
cout = (cout + 1) % 2;
user.flag = true;
//唤醒一个在 await()等待队列中的线程。与Object.notify()相似
user.conditionLock.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
//解锁
user.lock.unlock();
}
}
}
}
class OutputThread extends Thread {
private User user;
public OutputThread(User user) {
this.user = user;
}
@Override
public void run() {
while (true) {
user.lock.lock();
if (!user.flag) {
try {
user.conditionLock.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
System.out.println(user.name + "--" + user.sex);
user.flag = false;
user.conditionLock.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
user.lock.unlock();
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
User user = new User();
InputThread inputThread = new InputThread(user);
OutputThread outputThread = new OutputThread(user);
inputThread.start();
outputThread.start();
}
}
最新文章
- Python爬虫Scrapy框架入门(1)
- HBase的Write Ahead Log (WAL) —— API与基本概念
- Leetcode # 169, 229 Majority Element I and II
- 100款免费的圣诞节矢量图标素材(PSD &; SVG)
- C#获取本机的MAC地址
- Spring 循环引用(singleton与prototype初始化的区别)
- Django admin进阶
- ASP.NET 日志
- 【HDOJ】2722 Here We Go(relians) Again
- 大话设计模式C++实现-文章7章-代理模式
- Android Studio 中提示 Private field 'mType' is assigned but never accessed 的原因
- java_web学习(九) PreparedStatement动态参数的引入
- lamp环境搭建经验总结
- 对小程序框架WePY的精简总结
- arcgis在折点处打断并建立网络分析(最短路径等问题)
- .net core实践系列之SSO-同域实现
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(三十):使用flatMapGroupsWithState替换agg
- cnn 经典网络结构 解析
- mysql之 Percona XtraDB Cluster集群线程模型
- SQL记录-PLSQL条件控制
热门文章
- ASP.NET 一般处理程序 接收文件上传
- JAVA基础之ServletContext对象
- cscope安装
- 必须使用适当的属性或方法修改“ContentType”标头
- Python2 和 pip2 存在, Python3 也存在,但是 pip3 不存在的解决办法
- MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
- ansible之基础篇(三)
- [centos][yum] centos升级到特定版本
- 结构型模式(四) 组合模式(Composite)
- 如何获取一个Java对象所占内存大小