使用synchronized wait() notifyall() 实现简单的加减法同步 竞争抢答
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.concurrent.FutureTask; class Answer implements Callable<String>
{
private boolean flag = true;
@Override
public synchronized String call() throws Exception {
if(flag == true) {
Thread.sleep(100);
flag = false;
return Thread.currentThread().getName() + "抢答成功";
}
else {
return Thread.currentThread().getName() + "抢答失败";
}
}
} public class ThreadCompete {
public static void main(String[] args) {
Answer answer = new Answer();
FutureTask<String> task1 = new FutureTask<>(answer);
FutureTask<String> task2 = new FutureTask<>(answer);
FutureTask<String> task3 = new FutureTask<>(answer);
new Thread(task1).start();
new Thread(task2).start();
new Thread(task3).start();
try {
System.out.println(task1.get());
System.out.println(task2.get());
System.out.println(task3.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Resource{
private int num = 0;
private boolean flag = true;
public synchronized void add() {
while(this.flag == false) {
try {
super.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.num++;
System.out.println("加法操作-" + Thread.currentThread().getName() + this.num);
this.flag = false;
super.notifyAll();
}
public synchronized void sub() {
while(this.flag == true) {
try {
super.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(80);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.num--;
System.out.println("减法操作-" + Thread.currentThread().getName() + this.num);
this.flag = true;
super.notifyAll();
}
}
class Jia implements Runnable{
private Resource resource;
public Jia(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
resource.add();
}
}
}
class Jian implements Runnable{
private Resource resource;
public Jian(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
resource.sub();;
}
}
}
public class ThreadJiaJian {
public static void main(String[] args) {
Resource resource = new Resource();
Jian jian = new Jian(resource);
Jia jia = new Jia(resource);
new Thread(jian,"减法线程A").start();
new Thread(jian,"减法线程B").start();
new Thread(jia,"加法线程X").start();
new Thread(jia,"加法线程Y").start();
}
}
使用synchronized wait() notifyall() 实现简单的加减法同步 竞争抢答的更多相关文章
- 如何创建一个简单的C++同步锁框架(译)
翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...
- linux/windows系统oracle数据库简单冷备同步
linux/windows系统oracle数据库简单冷备同步 我们有一个财务系统比较看重财务数据的安全性,同时我们拥有两套系统,一个生产环境(linux),一个应急备份环境(windows).备份环境 ...
- 使用WinSCP进行简单代码文件同步
前言传输协议FTPFTPSSFTPSCP为什么使用WinSCP?CMD的FTP命令FileZillaPuTTYrsyncSublime的SFTP插件WinSCPWinSCP进行简单代码文件同步总结备注 ...
- 基于synchronized 或 ReadWriteLock实现 简单缓存机制
package cn.xxx.xxx; import java.util.HashMap; import java.util.Map; import java.util.concurrent.lock ...
- 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】
方法一:传统的线程方法import org.apache.log4j.Logger; /** * 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/> * ...
- [Java Concurrent] 多线程合作 wait / notifyAll 的简单案例
本案例描述的是,给一辆汽车打蜡.抛光的场景. Car 是一辆被打蜡抛光的汽车,扮演共享资源的角色. WaxOnCommand 负责给汽车打蜡,打蜡时需要独占整部车,一次打一部分蜡,等待抛光,然后再打一 ...
- 简单的互斥同步方式——synchronized关键字详解
目录 1. 关于synchronized关键字 2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 2.2 synchronized是如何实现线程互斥访问 ...
- Java中Synchronized的用法(简单介绍)
简单介绍 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调 ...
- 多生产者多消费者(第一种方式),基于synchronized,wait,notifyAll
生产者消费者模式描述的是协调与协作关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用 的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者( ...
随机推荐
- 快速了解CSS3当中的HSLA 颜色值怎么算
CSS3文档中提到:(HSLA) H是色度,取值在0度~360度之间,0度是红色,120度是绿色,240度是蓝色.360度也是红色. S是饱和度,是色彩的纯度,是一个百分比的值,取值在0%~100%, ...
- ROS学习手记 - 7 创建ROS msg & srv
至此,我们初步学习了ROS的基本工具,接下来一步步理解ROS的各个工作部件的创建和工作原理. 本文的详细文档:http://wenku.baidu.com/view/623f41b3376baf1ff ...
- 4.安装mitmproxy问题处理
上次进行到安装 证书出现问题: 1.主要原因是:对应python版本不一致 需要3.6以上的版本 才能在cmd黑窗口执行 mitmdump命令 生成证书 如图: windows 版本 双击安装 mit ...
- oryx 分离&集成
公司需要用到在线的流程编辑器,我研究了下activiti,activiti-explorer 是一个 web流程编辑工具,根据我了解到的情况. activiti-explorer web流程编辑工具 ...
- Android 开发第二步——建立文件
先以Hello World工程为样板 启动AVD 但在编程过程中遇到了非常棘手的问题 等待下一期完成
- Flex的一些小实例
1,以上是一个导航菜单 2一下是一个撑开的mx:Spacer
- php实现单点登录实例
1.准备两个虚拟域名 127.0.0.1 www.a.com127.0.0.1 www.b.com 2.在a的根目录下创建以下文件 1 //index.php 2 3 <?php 4 sessi ...
- 浅析USB之设备枚举
当一个USB设备插入主机后,会有以下活动: 配上状态图
- jqGrid基本使用
jqGrid: 参照网址:官网地址http://www.trirand.com/ http://blog.mn886.net/jqGrid/(快速获取demo) http://www.guriddo. ...
- ThinkPHP5分页样式设置
手册上讲分页类的使用时对样式讲的不够详细,这里我结合个人的摸索给大家一些参考意见. config里的分页配置我使用的是系统默认的bootstrap,查看thinkphp\library\think\p ...