zoukankan      html  css  js  c++  java
  • 线程按序交替

    /*
     * Copyright (c) XXX Corp.
     * All Rights Reserved.
     */
    
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * Main.
     *
     * @author Feng Yongkang, 2020/10/26
     * @version XXX v1.0
     */
    public class Main {
        public static void main(String[] args) throws InterruptedException, ExecutionException {
            AlternateDemo alternateDemo = new AlternateDemo();
            new Thread(() -> {
                for (int i = 0; i < 5; i++) {
                    alternateDemo.loop1();
                }
            }, "线程A").start();
            new Thread(() -> {
                for (int i = 0; i < 5; i++) {
                    alternateDemo.loop2();
                }
            }, "线程B").start();
            new Thread(() -> {
                for (int i = 0; i < 5; i++) {
                    alternateDemo.loop3();
                }
            }, "线程C").start();
        }
    }
    
    class AlternateDemo {
      //交替的信号
    private int number = 1; private Lock lock = new ReentrantLock();
      //多线程下控制方法跟随信号执行
    private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); public void loop1() { lock.lock(); try { if (number != 1) { condition1.await(); } System.out.println(Thread.currentThread().getName()); number = 2; condition2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void loop2() { lock.lock(); try { if (number != 2) { condition2.await(); } System.out.println(Thread.currentThread().getName()); number = 3; condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void loop3() { lock.lock(); try { if (number != 3) { condition3.await(); } System.out.println(Thread.currentThread().getName()); number = 1; condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }
  • 相关阅读:
    Codeforces Beta Round #92 (Div. 2 Only) B. Permutations 模拟
    POJ 3281 Dining 最大流 Dinic算法
    POJ 2441 Arrange the BUlls 状压DP
    URAL 1152 Faise Mirrors 状压DP 简单题
    URAL 1039 Anniversary Party 树形DP 水题
    URAL 1018 Binary Apple Tree 树形DP 好题 经典
    pytorch中的forward前向传播机制
    .data()与.detach()的区别
    Argparse模块
    pytorch代码调试工具
  • 原文地址:https://www.cnblogs.com/xiaoeyu/p/13880597.html
Copyright © 2011-2022 走看看