ReentrantLock+Condition

多线程

http://www.nowcoder.com/questionTerminal/cd99fbc6154d4074b4da0e74224a1582

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.IntStream;

public class Main {

static List<Character> results;

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNextInt()) {
        final int total = scanner.nextInt();
        results = new ArrayList<>();
        Lock lock = new ReentrantLock();
        Condition[] conditions = {
                lock.newCondition(),
                lock.newCondition(),
                lock.newCondition(),
                lock.newCondition()
        };
        final Future<Boolean>[] taskResult = new Future[1];
        ExecutorService executor = Executors.newFixedThreadPool(4);
        IntStream.rangeClosed(0, 3).forEach(it -> {
            taskResult[0] = executor.submit(new Task(lock, conditions[it], conditions[it == 3 ? 0 : it + 1], total, it));
        });
        executor.shutdown();
        try {
            if (taskResult[0].get(2, TimeUnit.SECONDS)) {
                for (Character item : results) {
                    System.out.print(item);
                }
                System.out.println();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }
}

static class Task implements Callable<Boolean> {

    static char[] WORDS = {'A', 'B', 'C', 'D'};

    int count;

    Condition conSelf;

    Condition conTarget;

    int index;

    Lock lock;

    Task(Lock lock, Condition conSelf, Condition conTarget, int count, int index) {
        this.lock = lock;
        this.count = count;
        this.conSelf = conSelf;
        this.conTarget = conTarget;
        this.index = index;
    }

    public Boolean call() {
        while (count > 0) {
            try {
                lock.lock();
                while (results.size() % WORDS.length != index) {//弃锁条件
                    conSelf.await(); 
                }
                results.add(WORDS[index]);
                count--;
                conTarget.signal(); //唤醒等待此condition的线程
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
        return true;
    }
}

}

全部评论

相关推荐

05-21 18:32
已编辑
湖南工学院 Java
这条干货多数是给i人朋友们分享的,知道你们开不了口,可以试试我说的这些方法1.调整心态:接受初期的尴尬刚开始进入一个新环境,双方都属于一个认识对方的过程,尴尬瞬间是难免存在的。首先,你要接受尴尬,允许自己犯错,实习期本身就是来学习的,同事也不会期待你完美无缺。另外,不要太以自我为中心,其实你的尴尬瞬间也许没有人在意,是因你的对自己的关注而放大了不安全感。2.准备一些防止尴尬的话题和工作相关的,可以以请教的方式开启。比如:xx,这个表格我没有看懂,可以给我讲一下吗非工作的话题,可以聊聊中午吃什么、当地的天气如何、通勤远不远之类的。比如:附近有什么好吃的外卖吗?我刚来还不太熟悉3.每日练习,逐渐打...
sweep^0416:内向人,遇到好的领导很重要,我之前一段实习组里全e人就我一个i 刚入职第一周还会带着我聊一下,后面越来越冷落我,实在受不了,每天去到就想亖,mentor还要pua说是我融入不了集体(我真的以为是我的问题)后面我离职了,去了现在这一家公司,我的领导也是e人,但是我融入的很好,组里的人全都很好很好,也不会出现小团体什么的,所以说内向不是不融入环境的根本,就是公司跟带教的问题
点赞 评论 收藏
分享
04-02 16:49
门头沟学院 Java
_bloodstream_:我也面了科大讯飞,主管面的时候听说急招人优先考虑能尽快实习的,我说忙毕设,后面就一直没消息了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务