笔试 / 10.09选择题猜牌有点耗费时间,不过只要做过就很简单了1.猜牌有人从一手纸牌中选定一张牌,他把这张牌的花色告诉X先生,而把点数告诉了Y先生。两位先生都知道这手纸牌是:黑桃J、8、4、2;红心A、Q、4;方块A、5;草花K、Q、5、4。X先生和Y先生都很精通逻辑,很善于推理。他们之间有对话如下:Y先生:我不知道这张牌。X先生:我知道你不知道这张牌。Y先生:现在我知道这张牌了。X先生:现在我也知道了。根据以上对话,你能推测出这是下面哪一张牌?( )A.方块A B.红心QC.黑桃4 D.方块5------------------------------------------------------------------------------------------------------------方块5称该牌为答案牌首先第一句,Y知道点数,如果是唯一出现的点数,如J,2,K都只出现了一次,那么Y先生就一定知道哪一张是答案牌了,但他不知道,故肯定不是这几种第二句话,X知道Y不知道,那么说X确定答案牌不是J,2,K这种只出现一次的牌,这是为什么呢?因为X是知道花色的,这说明答案牌的花色里不存在J,2,K这几种点数,比如告诉X答案牌的花色为红心,红心的选项为A、Q、4,都不惟一,故X可以确定那个人告诉Y的点数不是J,2,K这种出现一次的,而是A、Q、4中的其中一个数字,而仅知道这几个数字是不可能推断出具体牌的,故可推断花色只能是红心和方块。第三句话,Y先生:现在我知道这张牌了。由于假设XY绝对聪明,我们的分析X、Y也都知道,那么对于知道点数的Y,在确定花色只能是红心和方块之后,立刻得到了答案红心A、Q、4;方块A、5;排除A,若告诉Y的点数是A,即使知道了花色,Y也不可能立刻判断,因为两种花色都有还剩下:红心Q、4;方块5;最后,X先生:现在我也知道了。X知道了Y知道了以后,立刻得到答案,惟一的可能是那个人告诉X花色是方片。若告诉X花色是红心,则X还是不可能得到答案的。2.10运动员准备,都准备完成裁判发令 应该CyclicBarrier更合适CyclicBarrier cyclicBarrier = new CyclicBarrier(10,() -> System.out.println("裁判:所有运动员准备完毕,开始..."));        ExecutorService executor = Executors.newCachedThreadPool();        for (int i = 1; i <= 10; i++) {            final int offset = i;            executor.execute(() -> {                try {                    TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));                    System.out.println("运动员【" + offset + "】准备完毕" +                                        Thread.currentThread().getName());                    cyclicBarrier.await();                    System.out.println("运动员【" + offset + "】开跑。。。" +                                        Thread.currentThread().getName());                } catch (InterruptedException | BrokenBarrierException e) {                    e.printStackTrace();                }            });        }final CountDownLatch runner = new CountDownLatch(10);final CountDownLatch referee = new CountDownLatch(1);ExecutorService executor = Executors.newCachedThreadPool();for (int i = 1; i <= 10; i++) {    final int offset = i;    executor.execute(() -> {        try {            TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));            System.out.println("运动员【" + offset + "】准备完毕" +                                Thread.currentThread().getName());            runner.countDown();            referee.await();            System.out.println("运动员【" + offset + "】开跑。。。" +                                Thread.currentThread().getName());        } catch (InterruptedException e) {            e.printStackTrace();        }    });}runner.await();referee.countDown();System.out.println("裁判:所有运动员准备完毕,开始...");executor.shutdown();3.解决if-else太多问题 简答题卫语句 策略模式  函数式接口还要画类图,写代码,做到这已经没时间了,,,,,,,,,保融科技 一面6人 群面1. 一个线程能否调用两次start()方法?2.线程池中核心线程保活方式保活: 线程池中当没有任务时,核心线程总数不变队列必须是阻塞队列BlockingQueue线程池在有一个while方法,会通过getTask获取任务有就执行,执行完继续while没有任务,线程进入阻塞状态如果线程运行时抛出异常,会退出while 会有一个flag标志位,根据标志位以及核心线程数量进行判断,addWorker开启线程发生异常的线程会被线程池移除掉execute(Runnable command) ->     addWorker(Runnable firstTask, boolean core) -> run() -> runWorker(Worker w)对于execute来说,这个比较好理解,从源码中可以发现,线程池中的线程在执行runWorker的时候,如果任务中抛出异常,则线程会直接将异常抛出并且,在抛出异常后,为了避免异常任务的线程被污染,执行该任务的worker线程会被销毁,然后重新创建一个无任务非核心的worker线程。所以,即使线程池中的所有任务都失败了,只要核心线程数不为0,程序就将会一直被workQueue#poll阻塞,导致Jvm不会退出.3.IO 模型IO 多路复用模型buffer4.线程 进程 协程 区别
点赞 6
评论 3
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务