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. uva-10282-枚举

    题意:语言翻译, 直接map即可 #include "pch.h" #include <string> #include<iostream> #includ ...

  2. java中的排序--排序容器_TreeSet与TreeMap

    1.TreeSet:数据元素可以排序且不可重复. 对比: (1)Set接口:HashSet,元素必须重写hashcode和equals方法. (2)TreeSet:只要可以排序即可.去重:比较等于0即 ...

  3. 《GPU高性能编程CUDA实战》第六章 常量内存

    ▶ 本章介绍了常量内存的使用,并给光线追踪的一个例子.介绍了结构cudaEvent_t及其在计时方面的使用. ● 章节代码,大意是有SPHERES个球分布在原点附近,其球心坐标在每个坐标轴方向上分量绝 ...

  4. 【Source Insight 】之marco学习笔记1

    我们学习编程语言都是从Hello World!,现在我们学习marco也不例外 打开C:\Users\%USERPROFILE%\Documents\Source Insight 4.0\Projec ...

  5. react-native 相对项目路径导入组件

    在使用react-native的时候,经常要自定义很多组件,但是只能使用../../../的方式,如果目录多了一长串,书写很烦,看着也不好看. 方法一: 例如你想引入utils里面的文件,不想../. ...

  6. 机器学习进阶-图像形态学操作-开运算与闭运算 1.cv2.morphologyEx(进行各类形态学变化) 2.op=cv2.MORPH_OPEN(先腐蚀后膨胀) 3.op=cv2.MORPH_CLOSE(先膨胀后腐蚀)

    1.cv2.morphologyEx(src, op, kernel) 进行各类形态学的变化 参数说明:src传入的图片,op进行变化的方式, kernel表示方框的大小 2.op =  cv2.MO ...

  7. Python_02 基本数据类型、while循环

    1.基本数据类型 1.字符串(引号内): name=“我是Manuel” name='我是Manuel' name="""Manuel""" ...

  8. Windows下如何查看某个端口被谁占用

    开发时经常遇到端口被占用的情况,这个时候总是很令人抓狂,知道被哪个进程占用还好,结束就是了,要是不知道我们该怎么办呢? 我告诉大家一个方法,^_^. 1. 开始—->运行—->cmd,或者 ...

  9. Others-大数据平台Lambda架构浅析(全量计算+增量计算)

    大数据平台Lambda架构浅析(全量计算+增量计算) 2016年12月23日 22:50:53 scuter_victor 阅读数:1642 标签: spark大数据lambda 更多 个人分类: 造 ...

  10. https 学习总结

    最近看了点https 做下总结  面的博客如果没有错误的话,理解起来绝对是醍醐灌顶!让人信服,如果我的理解有问题,请及时指正! 参考博客:    http://www.ruanyifeng.com/b ...