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() 实现简单的加减法同步 竞争抢答的更多相关文章

  1. 如何创建一个简单的C++同步锁框架(译)

    翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...

  2. linux/windows系统oracle数据库简单冷备同步

    linux/windows系统oracle数据库简单冷备同步 我们有一个财务系统比较看重财务数据的安全性,同时我们拥有两套系统,一个生产环境(linux),一个应急备份环境(windows).备份环境 ...

  3. 使用WinSCP进行简单代码文件同步

    前言传输协议FTPFTPSSFTPSCP为什么使用WinSCP?CMD的FTP命令FileZillaPuTTYrsyncSublime的SFTP插件WinSCPWinSCP进行简单代码文件同步总结备注 ...

  4. 基于synchronized 或 ReadWriteLock实现 简单缓存机制

    package cn.xxx.xxx; import java.util.HashMap; import java.util.Map; import java.util.concurrent.lock ...

  5. 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】

    方法一:传统的线程方法import org.apache.log4j.Logger; /** * 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/> * ...

  6. [Java Concurrent] 多线程合作 wait / notifyAll 的简单案例

    本案例描述的是,给一辆汽车打蜡.抛光的场景. Car 是一辆被打蜡抛光的汽车,扮演共享资源的角色. WaxOnCommand 负责给汽车打蜡,打蜡时需要独占整部车,一次打一部分蜡,等待抛光,然后再打一 ...

  7. 简单的互斥同步方式——synchronized关键字详解

    目录 1. 关于synchronized关键字 2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 2.2 synchronized是如何实现线程互斥访问 ...

  8. Java中Synchronized的用法(简单介绍)

    简单介绍 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调 ...

  9. 多生产者多消费者(第一种方式),基于synchronized,wait,notifyAll

    生产者消费者模式描述的是协调与协作关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用 的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者( ...

随机推荐

  1. github构建个人网站模板

    http://novoland.github.io/%E5%B9%B6%E5%8F%91/2014/09/11/ThreadLocal%20%E5%88%86%E6%9E%90.html

  2. pythoner国内比较快 的 镜像源

    pythoner国内比较快 的  镜像源 pip install pyqt5 = 5.9 -i https://pipy pip使用过程中的痛苦,大家相必都已经知道了,目前豆瓣提供了国内的pypi源, ...

  3. 33.scrapy采集网站表单数据

    这几天一直都再用scrapy写网站数据采集的爬虫,这里我就选一个写过的爬虫来记录一下. 杭州造价网:http://183.129.219.195:8081/bs/hzzjb/web/list 这里出现 ...

  4. 《算法》第四章部分程序 part 5

    ▶ 书中第四章部分程序,加上自己补充的代码,图的深度优先遍历 ● 无向图的广度优先遍历,有向 / 无向图代码仅若干方法名不同 package package01; import edu.princet ...

  5. smfony

    1.smfony设置量表之间的关系 2.smyfony2-curd-数据库创建 3.smyfony2 增删改查 4. 5. 6.

  6. oracle常用函数详解(详细)

    转自:https://www.cnblogs.com/lxl57610/p/7442130.html Oracle SQL 提供了用于执行特定操作的专用函数.这些函数大大增强了 SQL 语言的功能.函 ...

  7. Linux服务器mysql,nginx等自动停止的排查,以及解决方法

    最近发现自己使用的某台云服务武器只要稍微流量大一点,就会出现莫名的的数据库连接错误的情况 ,然后连上服务器查看,发现mysql进程被结束了,经常出现这种情况,这还怎么得了,然后第一时间查看mysql日 ...

  8. smarty获取php中的变量

    {$smarty}保留变量不需要从PHP脚本中分配,是可以在模板中直接访问的数组类型变量,通常被用于访问一些特殊的模板变量.例如,直接在模板中访问页面请求变量.获取访问模板时的时间邮戳.直接访问PHP ...

  9. JeeWx捷微3.1小程序版本发布,支持微信公众号,微信企业号,支付窗——JAVA版开源微信管家

    支持小程序,JeeWx捷微3.1小程序版本发布^_^ JeeWx捷微V3.1——多触点小程序版本管理平台(支持微信公众号,微信企业号,支付窗)   JeeWx捷微V3.1.0版本紧跟微信小程序更新,在 ...

  10. centos7 redis配置

    https://www.cnblogs.com/web424/p/6796993.html