zoukankan      html  css  js  c++  java
  • java 多线程 day13 condition 线程通信


    /**
    * Created by chengtao on 17/12/5.
    * Condition 类似 wait和notify,解决线程间的同步问题
    */


    import java.util.concurrent.atomic.AtomicInteger;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;

    public class Thread1301_ConditionCommunication {

    /**
    * @param args
    */
    public static void main(String[] args) {

    final Business business = new Business();
    new Thread(
    new Runnable() {
    public void run() {
    for(int i=1;i<=50;i++){
    business.sub(i);
    }
    }
    }
    ).start();

    for(int i=1;i<=50;i++){
    business.main(i);
    }

    }

    static class Business {
    Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition();
    private boolean bShouldSub = true;
    public void sub(int i){
    lock.lock();
    try{
    while(!bShouldSub){
    try {
    condition.await();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    for(int j=1;j<=10;j++){
    System.out.println("sub thread sequence of " + j + ",loop of " + i);
    }
    bShouldSub = false;
    condition.signal();
    }finally{
    lock.unlock();
    }
    }

    public void main(int i){
    lock.lock();
    try{
    while(bShouldSub){
    try {
    condition.await();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    for(int j=1;j<=100;j++){
    System.out.println("main thread sequence of " + j + ",loop of " + i);
    }
    bShouldSub = true;
    condition.signal();
    }finally{
    lock.unlock();
    }
    }
    }
    }
    --------------------------------
    --------------------------------
    --------------------------------

    import java.util.concurrent.atomic.AtomicInteger;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;

    public class Thread1302_Condition_3ThreadCom {

    public static void main(String[] args) {

    final Business business = new Business();
    new Thread(
    new Runnable() {
    public void run() {
    for(int i=1;i<=50;i++){
    business.sub2(i);
    }
    }
    }
    ).start();

    new Thread(
    new Runnable() {
    public void run() {
    for(int i=1;i<=50;i++){
    business.sub3(i);
    }
    }
    }
    ).start();

    for(int i=1;i<=50;i++){
    business.main(i);
    }

    }

    static class Business {
    Lock lock = new ReentrantLock();
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();
    private int shouldSub = 1;
    public void sub2(int i){
    lock.lock();
    try{
    while(shouldSub != 2){
    try {
    condition2.await();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    for(int j=1;j<=10;j++){
    System.out.println("sub2 thread sequence of " + j + ",loop of " + i);
    }
    shouldSub = 3;
    condition3.signal();
    }finally{
    lock.unlock();
    }
    }

    public void sub3(int i){
    lock.lock();
    try{
    while(shouldSub != 3){
    try {
    condition3.await();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    for(int j=1;j<=20;j++){
    System.out.println("sub3 thread sequence of " + j + ",loop of " + i);
    }
    shouldSub = 1;
    condition1.signal();
    }finally{
    lock.unlock();
    }
    }

    public void main(int i){
    lock.lock();
    try{
    while(shouldSub != 1){
    try {
    condition1.await();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    for(int j=1;j<=100;j++){
    System.out.println("main thread sequence of " + j + ",loop of " + i);
    }
    shouldSub = 2;
    condition2.signal();
    }finally{
    lock.unlock();
    }
    }
    }
    }

     
  • 相关阅读:
    python__基础 : 类属性,类方法,静态方法
    python__基础 : 类的继承,调用父类的属性和方法
    python__基础 : 类的__init__,__str__,__del__方法
    Python__关于列表的引用 以append操作为例
    HTML5 Canvas 绘制图片不显示的问题
    MySQL 查询排除指定字段、自定义变量、动态执行SQL
    .Net系列 Transaction 事务
    Redis 基本操作
    C# 数值计算、转换
    详解.NET IL代码
  • 原文地址:https://www.cnblogs.com/ctaixw/p/7980300.html
Copyright © 2011-2022 走看看