JAVA基础学习--一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized
来源:互联网 发布:aj淘宝官方旗舰店 编辑:程序博客网 时间:2024/05/29 14:22
使用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........0Thread-1........1Thread-3........0Thread-0........1Thread-2........0Thread-1........1Thread-3........0Thread-0........1Thread-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........1Thread-3........0Thread-0........1Thread-2........0Thread-1........1Thread-3........0Thread-0........1Thread-2........0
0 0
- JAVA基础学习--一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized
- 设计两个线程一个线程做加运算一个线程减运算
- 一个线程交替运行的考题
- [Java] Thread 线程交替运行
- 多个并行线程运算
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数(方法一)
- JAVA线程基础(synchronized锁的学习)(一)
- Java线程(一):synchronized
- java 一个线程执行加,一个线程执行减
- java 一个线程执行减,一个线程执行加
- 多个线程同时写入一个文件问题------php
- Java 线程 synchronized 学习
- implements Runnable synchronized代码块 * 2个线程向同一数组中加随机数,每个数组加3个数,交替
- implements Runnable synchronized代码块 * 2个线程向同一数组中加随机数,每个数组加3个数,交替
- 建立m个线程,每个线程只能打印一种字符,要求纯种同时运行,交替打印n次字符
- java让2个线程交替执行
- 用一个线程模拟多个线程,减少线程数量~
- 用一个线程模拟多个线程,减少线程数量~
- HMM——维特比算法(Viterbi algorithm)
- 这里选择VS 2010作为dll的开发工具
- OpenCV 使用FaceRecognizer类来进行人脸识别
- Hadoop问题,求解
- C++利用模板实现一个队列
- JAVA基础学习--一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized
- 例题:[codevs1073/tyvj1251]家族 并查集 学习笔记
- 项目管理中使用禅道
- 2015.9.19 第十三堂 NSSArray
- 高性能的大型系统经验 -- 数据查询与分页
- 关于Linux/kernel.h中的offsetof和container_of宏
- java中基本数据类型和引用数据类型的区别?
- Android中常见Intent习惯用法-上篇(附源码下载)
- 基于大规模XML数据的关键字查询处理关键技术研究