一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized
使用synchronized
- package com.pb.thread.demo5;
- /**使用synchronized
- * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行
- *
- * @author Denny
- *
- */
- public class Count {
- private int num = 0;
- private boolean flag = false; // 标识
- //加法
- public synchronized void add() {
- while (flag) {
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- this.num++; //加
- System.out.println(Thread.currentThread().getName() + "........" + this.num);
- this.flag=true; //设置标识为true
- notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
- }
- //减法
- public synchronized void sub() {
- while (!flag) {
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- this.num--; //减
- System.out.println(Thread.currentThread().getName() + "........" + this.num);
- this.flag=false; //设置标识为true
- notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
- }
- }
- package com.pb.thread.demo5;
- public class Add implements Runnable {
- private Count count;
- public Add(Count count){
- this.count=count;
- }
- @Override
- public void run() {
- while(true){
- count.add();
- }
- }
- }
- //================
- package com.pb.thread.demo5;
- public class Sub implements Runnable {
- private Count count;
- public Sub(Count count){
- this.count=count;
- }
- @Override
- public void run() {
- while(true){
- count.sub();
- }
- }
- }
测试类
- package com.pb.thread.demo5;
- public class CountTest {
- public static void main(String[] args) {
- Count c=new Count();
- Add add=new Add(c);
- Sub sub=new Sub(c);
- Thread t1=new Thread(add);
- Thread t2=new Thread(add);
- Thread t3=new Thread(sub);
- Thread t4=new Thread(sub);
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
- }
结果:
- Thread-2........0
- Thread-1........1
- Thread-3........0
- Thread-0........1
- Thread-2........0
- Thread-1........1
- Thread-3........0
- Thread-0........1
- Thread-2........0
不使用synchronized
- package com.pb.thread.demo4;
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- /**
- * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行
- * @author Denny
- *
- */
- public class Count {
- private int num = 0;
- private boolean flag=false; // 标识
- Lock lock = new ReentrantLock(); // 锁
- Condition add = lock.newCondition(); // 加法锁
- Condition sub = lock.newCondition();// 减法锁
- public void add() {
- lock.lock();// 锁上
- try {
- while (flag) { //循环判断
- add.await();
- }
- this.num++;
- System.out.println(Thread.currentThread().getName() + "........" + this.num);
- this.flag = true; // 设置标识
- sub.signal(); // 唤醒指定线程
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally{
- lock.unlock();
- }
- }
- public void sub() {
- lock.lock();// 锁上
- try {
- while (!flag) {//循环判断
- sub.await();
- }
- this.num--;
- System.out.println(Thread.currentThread().getName() + "........" + this.num);
- this.flag = false; // 设置标识
- add.signal(); // 唤醒指定线程
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally{
- lock.unlock();
- }
- }
- }
- package com.pb.thread.demo4;
- public class Add implements Runnable {
- private Count count;
- public Add(Count count){
- this.count=count;
- }
- @Override
- public void run() {
- while(true){
- count.add();
- }
- }
- }
- package com.pb.thread.demo4;
- public class Sub implements Runnable {
- private Count count;
- public Sub(Count count){
- this.count=count;
- }
- @Override
- public void run() {
- while(true){
- count.sub();
- }
- }
- }
- package com.pb.thread.demo4;
- public class CountTest {
- public static void main(String[] args) {
- Count c=new Count();
- Add add=new Add(c);
- Sub sub=new Sub(c);
- Thread t1=new Thread(add);
- Thread t2=new Thread(add);
- Thread t3=new Thread(sub);
- Thread t4=new Thread(sub);
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
- }
结果:
- Thread-1........1
- Thread-3........0
- Thread-0........1
- Thread-2........0
- Thread-1........1
- Thread-3........0
- Thread-0........1
- Thread-2........0
一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized的更多相关文章
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
[源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...
- threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证是同一个
threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证同一个线程中是同一个共享对象. 如果是静态变量是共享的话,那必须同步,否则尽管有副本,还是会出错,故C错
- Java线程学习笔记(一个)
一个.正在创建的线程: 老掉牙的话题了.继承 java.lang.Thread父类或者实现Runnalbe接口.这里就提一句: class Thread implements Runnable Thr ...
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)
对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method ...
- 线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)
任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...
- java main()线程是不是最后一个退出的(相比较main中创建的其他多个线程)
JVM会在所有的非守护线程(用户线程)执行完毕后退出: main线程是用户线程: 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程. pu ...
随机推荐
- PLSQL快捷补充代码设置
菜单Tools-->Preferences...然后依次选择下图红色选项 弹出下图对话框 输入需要快速生成的语句点击保存 点击Save后在slq窗口中输入 设置的语句缩写 列入:第一个sf 然 ...
- 路由器换大Flash
使用winhex自建编程器固件(我的是TP-WR941N V6) 1:使用winhex新建一个8M,16M的文件,编辑-全选,填充选块,填充十六进制数值 FF : 2:打开4M的原厂编程器固件(或者自 ...
- 搭建windows下filezilla FTP服务器
FTP服务器必不可少,鉴于serv-u越来越冗余繁多的设置,个人还是比较喜欢简单.干净,满足需求即可的东东,所以选择filezilla.更主要的原因是ta是开元免费使用的,虽然免费,功能却齐全,我发现 ...
- Web程序员开发App系列 - 调试Android和IOS手机代码(补图)
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- 红黑树(四)之 C++的实现
概要 前面分别介绍红黑树的理论知识和红黑树的C语言实现.本章是红黑树的C++实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章. 目录1. 红黑树的介绍2. 红黑树的C++ ...
- [IR] Boolean retrieval
How to build Inverted Index? 1. Token sequence. 2. Sort by terms. 3. Dictionary & Postings code ...
- RPM安装命令总结--转载
原地址:http://www.cnblogs.com/zqwang0929/p/3352237.html 在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装.卸载及管理等操作.RPM 的 ...
- 将excel导入mysql(使用navicat)
excel: 注: 1.mysql里建立一张跟excel一样的表结构的表(包含id) 2.excel最好没有任何格式,只是纯值,不然会出现导入不了的错误 ----------------------- ...
- 开源一个基于天天团购的团购app
可能大家都知道天天团购开源系统,一个做团购的开源项目很赞,前些日子做了基于天天团购系统做的团购客户端和移动端服务器!源代码放出,有了解的可以看看,希望收益! 先说服务器:app的服务器,基于天天团购的 ...
- 拓扑图弹力布局呈现Flickr图片搜索结果
十年前有值得分享的图片我都存在Flickr上,可惜yahoo收购了Flickr之后堕落好多年,最近yahoo在梅姐带领下Flickr团队终于恢复了生机,个人免费存储空间扩充到了1T,界面用户体验也有 ...