CyclicBarrier的行使

近些年间接整并发那块东西,顺便写点Java并发的例子,给大家做个享受,也深化下团结纪念,借使有怎么样错误恐怕不当的地点,欢迎大家斧正。

继续写,那是近年来八个月末了的一部分的总括了。

Cyclic巴里r是一种多线程并发控制实用工具,和CountDownLatch分外相近,它也得以兑现线程间的计数等待,不过它的作用比CountDownLatch尤其扑朔迷离且强大。CyclicBarrier能够驾驭为循环栅栏,这一个计数器能够频仍使用。比如,借使大家将计数器设置为10,那么凑齐第③批拾三个线程后,计数器就会归零,然后跟着凑齐下一批13个线程,那正是它的内在含义。

 

LOL和王者荣耀的玩家很多,许几人相应都有打大龙的阅历,话说早先时代我们打算一起去偷大龙,由于初期大家都相比弱,须求多少人都齐了才能打大龙,那样程序该怎样促成啊?本身很菜,起初自个儿的代码是如此写的(哈哈我们不要纠结作者的年华):

可能和面试有关,依然充满碎碎念,依旧那句话——文中疑似面经内容多来自个人推论,不享有科学性【别相信,没得到offer,看看就好】

public class KillDragon {
    /**
     * 模拟打野去打大龙
     */
   public static void dayePlayDragon(){
       System.out.println("打野在去打大龙的路上,需要10s");
   }

    /**
     * 模拟上单去打大龙
     */
    public static void shangdanPlayDragon(){
        System.out.println("上单在去打大龙的路上,需要10s");
    }

    /**
     * 模拟中单去打大龙
     */
    public static void zhongdanPlayDragon(){
        System.out.println("中单在去打大龙的路上,需要10s");
    }

    /**
     * 模拟ADC和辅助去打大龙
     */
    public static void adcAndFuzhuPlayDragon(){
        System.out.println("ADC和辅助在去打大龙的路上,需要10s");
    }

    /**
     * 模拟大家一起去打大龙
     */
    public static void killDragon()
    {
        System.out.println("打大龙...");
    }

    public static void main(String[] args)
    {
        dayePlayDragon();
        shangdanPlayDragon();
        zhongdanPlayDragon();
        adcAndFuzhuPlayDragon();
        killDragon();
    }

 

结果如下:

经历过游戏群面之后,和同班所在游荡,一级困,想到早晨有产品初试(录制面试),就回寝室补觉去了。面试前补觉真的很重庆大学!

打野在去打大龙的路上,需要10s
上单在去打大龙的路上,需要10s
中单在去打大龙的路上,需要10s
ADC和辅助在去打大龙的路上,需要10s
打大龙...

 

 那完了,大家在路上的时光就花了40s了,明显是荒唐的。要是都那样干,对方把你塔都要偷光了。不行得更上一层楼下,怎么改呢,十六线程并发执行,如是笔者改成了下边这样的,用volatile关键字。

本身也不知情自身为何是录制面试,初试复试都以,可能是自家报的是SNG事业群的原由?

private static volatile int i = 4;
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                long start = System.currentTimeMillis();
                while (i!=0){

                }
                while (i==0) {
                    killDragon();
                    i--;
                    long t = System.currentTimeMillis() - start;
                    System.out.println("总共耗时:"+t+"毫秒");
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                dayePlayDragon();
                try {
                    Thread.sleep(10000);
                    i--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                shangdanPlayDragon();
                try {
                    Thread.sleep(10000);
                    i--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                zhongdanPlayDragon();
                try {
                    Thread.sleep(10000);
                    i--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                adcAndFuzhuPlayDragon();
                try {
                    Thread.sleep(10000);
                    i--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

实质上作者以为比较于公然的一对一面试,摄像面试对自笔者来说是不利于的,会在自然水准上阻碍作者人格魔力的散发(不要脸=。=),终究录像并未真人直观。

结果如下:

 

打野在去打大龙的路上,需要10s
上单在去打大龙的路上,需要10s
中单在去打大龙的路上,需要10s
ADC和辅助在去打大龙的路上,需要10s
打大龙...
总共耗时:10005毫秒

笔者的初试定在了早晨7点,提前加了面试的QQ,近期面试的人居多,面试官也很劳碌,加上了有的其余面试同学时间延长了,所以等到了早晨8点才正式启幕面试。

结果就像是还能够,可是处理起来实在是有点麻烦,须求 while
(i!=0)一直在这循环着。那时候学到了用 CyclicBarrier来处理,代码如下:

 

public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(5);
        new Thread(new Runnable() {
            @Override
            public void run() {
                long start = System.currentTimeMillis();
                try {
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                killDragon();
                long t = System.currentTimeMillis() - start;
                System.out.println("总共耗时:"+t+"毫秒");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                dayePlayDragon();
                try {
                    Thread.sleep(10000);
                    barrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                shangdanPlayDragon();
                try {
                    Thread.sleep(10000);
                    barrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                zhongdanPlayDragon();
                try {
                    Thread.sleep(10000);
                    barrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                adcAndFuzhuPlayDragon();
                try {
                    Thread.sleep(10000);
                    barrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

初试官是三个特意美丽温柔的小妹妹,笑意盈盈的,面试流程仍旧从自作者介绍开首。

世家都没到达从前都等候,结果如下:

大概流程:

打野在去打大龙的路上,需要10s
上单在去打大龙的路上,需要10s
中单在去打大龙的路上,需要10s
ADC和辅助在去打大龙的路上,需要10s
打大龙...
总共耗时:10002毫秒
  1. 自小编介绍
  2. 项目介绍
  3. 规划一款硕士社交APP,讲出模块和天性
  4. 推荐介绍一道四款APP,说说理由
  5. 兴趣爱好

CyclicBarrier相当于线程的计数器:

 

CyclicBarrier开端化时规定3个数额,然后总结调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了那么些数目时,全部进入等待状态的线程被提醒并继续。
CyclicBarrier就象它名字的意趣同样,可用作是个障碍,
全数的线程必须到齐后才能一起经过那些障碍。
CyclicBarrier早先时还可带二个Runnable的参数,
此Runnable职责在CyclicBarrier的多寡达到后,全体别的线程被提醒前被实施。
当然如此使用CyclicBarrier和行使CountDownLatch是没什么差异的,正如前文所说的CyclicBarrier的功能尤其的扑朔迷离且强大。给大家看一个《实战Java高并发程序设计》一书上的一个事例。
比如:司令下达指令,须要拾3个兵卒去联合完毕一项任务。那时,就会需要拾二个兵士先凑合广播发表,接着,一起雄赳赳气昂昂地去实施职分。当拾个兵卒都实施完了职务,那么司机就能够对外声称,职责完成。相比CountDownLatch,CyclicBarrier能够承受多少个参数作为BarrierAction。所谓的BarrierAction正是当计数器三回计数完结后,系统会执行的动作。如下构造函数,个中,parties表示技术总数,也正是参预的线程总数。

自笔者介绍方面本身照旧遵照老套路走,吸取了事先Ali电面的训诫,先简单的牵线了易班,然后不难说了说项目意况(STA福特Explorer原则,情景,职责,行动,结果),最终对小四妹表示一下谢谢。

public CyclicBarrier(int parties, Runnable barrierAction)

 

下边示例演示了上述职分场景

后来小大姨子针对笔者的品类之一的跳蚤市镇开始展览了部分粗略的垂询,实话实说就好。

public class CyclicBarrierDemo {
    public static class Soldier implements Runnable {
        private String soldier;
        private final CyclicBarrier cyclicBarrier;

        public Soldier(CyclicBarrier cyclicBarrier, String soldier) {
            this.soldier = soldier;
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run() {
            try {
                cyclicBarrier.await();
                doWork();
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }

        void doWork() {
            try {
                Thread.sleep(Math.abs(new Random().nextInt() % 10000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(soldier + ":任务完成");
        }
    }

    public static class BarrierRun implements Runnable {

        boolean flag;
        int N;

        public BarrierRun(boolean flag, int N) {
            this.flag = flag;
            this.N = N;
        }

        @Override
        public void run() {
            if (flag) {
                System.out.println("司令:[士兵" + N + "个,任务完成!");
            } else {
                System.out.println("司令:[士兵" + N + "个,集合完毕!");
                flag = true;
            }
        }
    }

    public static void main(String args[]) {
        final int N = 10;
        Thread[] allSoldier = new Thread[N];
        boolean flag = false;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(N, new BarrierRun(flag, N));
        System.out.println("集合队伍!");
        for (int i = 0; i < N; i++) {
            System.out.println("士兵" + i + "报道!");
            allSoldier[i] = new Thread(new Soldier(cyclicBarrier, "士兵" + i));
            allSoldier[i].start();
        }
    }
}

 

推行结果如下:

或是是小大嫂觉得依然不太明了自个儿的能力,于是给了本人3分钟让作者设计一款大学生社交类APP,一开始听到时间的时候心里一惊,然后拿起笔就起来记录下来,从大学生特点起首列要点,然后开端想框架,简单的写了几点今后,因为日子不够,感觉大概了就半夏娘姐说大约了——这一个时候其实早已身故了五分钟了,小大姨子那里也关了录像,只剩余本人和显示屏里的友好相互看哈哈——笔者备感那里纵然小堂姐不会提醒您时刻到了,不过一旦拖得久了会影响成绩,毕竟产品老总是很必要时间观念的;此外,如果面试官那里关了录制也并非紧张,反正笔者后来全程望着镜头下的大团结在自身欣赏,那样仍是能够让面试官觉得自家在看画面。

集合队伍!
士兵0报道!
士兵1报道!
士兵2报道!
士兵3报道!
士兵4报道!
士兵5报道!
士兵6报道!
士兵7报道!
士兵8报道!
士兵9报道!
司令:[士兵10个,集合完毕!
士兵0:任务完成
士兵2:任务完成
士兵9:任务完成
士兵3:任务完成
士兵7:任务完成
士兵8:任务完成
士兵1:任务完成
士兵4:任务完成
士兵5:任务完成
士兵6:任务完成
司令:[士兵10个,任务完成!

 

本人的大体规划:(经过前期整理)

大学生用户社交特点:认识新的好对象,约学习,找人共同娱乐(为主)

相对应的功用模块:聊天,音信公布(约学习,约玩耍,学校/公共活动发布)

经营销售方案:1.融入学运进入推广 2.采纳QQ/微信平台小游戏吸引玩家

 

在叙述自个儿的想法的时候,为了能让面试官立小学二姐更好的了解,我顺便讲了讲学生选择《11点10分》,在打闹引入方面讲了讲未来比较火的桌游什么的组团玩缺人的事态,建议了贰个见识——在游玩中(特别是亟需语言沟通的嬉戏)的同室更易于发生友情,更便于达成社交的目标。

 

在这几个设计APP的环节中本身的呈现并倒霉,因为自个儿发觉当初在动脑筋的时候是有诸多局限性的:

1
思想局限在了同桌的同桌社交上了(那些在应对前期想到了,所以硬生生的加了公布部分歌唱会等集体活动我们共同参与那种新闻的发布来挽救一下)

2终极的应酬其实应当是靠聊天建立的,纵然笔者在进度中涉嫌了《11点10分》,可是在友好的制品构想中,没有提到聊五月能够建立部分随意匹配聊天什么的

3树洞为啥收到欢迎?因为各种人都有想要倾诉的事物,所以博士社交APP能够把“匿名聊天·随机匹配”作为亮点,不过那点截止自个儿合上电脑本人才发觉到温馨漏掉了这么重要的三个卖点。

 

推荐APP是学员文章《花》,和腾讯网刚出没多长期的一款使用《搜狐蜗牛读书》(不过觉得在这一个环节腾讯一般有个别排斥作者讲新浪的成品……)。在那么些环节,笔者先和小妹妹表明了友好比较喜欢找一些小众的APP举办体验,然后引申出《花》。

 

《花》是一款日记APP,针对对象是写日记的人和想养成写日记习惯的人,产品构想来源于沟通日记和养花。作者在介绍的时候就漏掉了“沟通日记”这二个特色,初试复试都遗忘了。

《新浪蜗牛读书》有意思的在于,你一天只好免费阅读它书库里的书60分钟,若是想要再往下读书要钱卖时长。喜欢这几个APP的缘由相当大程度是因为这几个动用给作者传递出了“时间是金”的观点,让自家想要不浪费着难得的免费的60秒钟,努力的多看书来充实本人——而且60分钟一到你假诺恰巧看到美丽的一部分,真的是心痒痒想要花钱看下来,它的商业格局把人的心境拿捏的很准。

自己在说那里的时候,小小妹问小编有没有用户微信读书感觉怎样——但是本人并不曾用过,笔者是3个忠实的QQ的使用者,所以作者顺了小二嫂的话吐槽了自个儿认为微信存在的题材和本身不喜欢用的缘故。

 

最终小堂妹问作者经常喜爱干什么,看书,听歌,游戏,旅游。作者说自家要好是一个很争辨的人“静如处子,动如疯兔”,小大姨子没忍住笑了哈哈,然后她问了问作者喜爱什么游戏,近日在玩什么。笔者实在多年来不太玩《阴阳师》了,但照旧嘴一哆嗦就说了阴阳师,然后才说《王者荣耀》(那刹那间的嘴瓢真的弄的自己心中卧槽卧槽的)。后来大家一同座谈了哪些游戏比较好玩,反正本身觉得王者荣耀耐玩一点哟,毕竟阴阳师出来叁个月就回流了【托腮】。

新兴就讲到旅游,小二嫂问作者去了怎么地方,我固然喜欢旅游,可是去的地方不多。作者特老实的说自家去过哪里哪里,就算地方不多,然则本人以为小编玩的很深(笔者以为那便是显现本身优势的地点啊,表明一(Wissu)(Nutrilon)下本人有相比较强的洞察力)。小四妹具体问了问作者第比利斯的路程,正好是自个儿以为温馨玩的最深度的一回旅行,作者就把温馨骑着ofo满地拉那乱跑感受到的老利兹文化麻芋果娘姐说了说,假设说我初试为啥能通过,笔者认为正是此处让小大姨子给自家加了分。

 

之后也就没说哪些了,小小姨子说他迟点会更新本人的境况,作者发挥了多谢就长逝了此次初试。

 

就好像前面所说的,小编在关上电脑就发现自个儿设计的APP的题材,回想一下感觉到条理性也不是很好,所以觉得温馨要挂。当天早晨本来想要看看本人的景况是或不是变成了“不适当”,然后彻底死心,结果发现自个儿的景况变成复试了,真的大胆阶段使命完成的感觉到,超欣然自得。

 

接下来讲讲五一前的复试。复试布告是初试(周三)后第叁天接到让自家星期日去现场馆试,不过后来又接受了一个短信调整成了礼拜五早上的录像面试。

 

那是友善首先次经历复试,真的超紧张,因为不知底会问什么,想技术岗的话二面是标准主管面,可是产品会问哪些小编在网上搜了很久也不驾驭。所以想无头苍蝇一样找了成都百货上千材料,不过却不许动手。

腾讯的校招网站上有线上宣讲会《鹅厂卧谈会》,挺狼狈的,干货不少,然则也从未复试的事物【躺】

 

这一次的流水生产线感觉比初试尤为规范,先是3个hr和本身电话协调时间,然后问了自己的QQ给小编发了邮件的复试特邀函,把新的面试QQ发给了自身。因为QQ别称写着“SNG面试官”,所以复试应该是准确到了SNG事业群的制品面试官。

 

挑选SNG社交网络事业群为意图单位的关键缘由有七个,第②个是因为自个儿是QQ拥护者,第三是因为他旗下的QQ/QQ空间/QQ音乐/腾讯课堂/腾讯云这个产品自己都还算相比较熟稔——但在复试进度中,小编忽然意识到自身挑选那几个事业群其实不是很有益。

 

复试7点开端,等了半个多小时才正式举办,差别于初试,这一次的面试官在七点的时候根本未曾在线,那时候的确有点受宠若惊。还有正是本次复试以前没睡觉=。=真的困到不行……所以感觉本身发挥很不佳……

 

复试的小三姐对待于初试的小四嫂要庄敬不少,感觉没那么放松了,所以精神有点绷。

 

复试的基本点流程:

  1. 自作者介绍
  2. 类型介绍
  3. 推荐多少个APP
  4. 一些小意思
  5. 有啥要问笔者的啊?

 

自作者介绍照旧不变的开始比赛,可是本次又差一点犯了Ali电面包车型大巴荒谬,险些忘记介绍易班的情形。

 

品种介绍照旧跳蚤市集,可是这一次问的愈来愈详实,让自己从什么规定这几个须求开首讲,问到一些细节,比如说为啥还没上线就重做了2.0版本,用户体验不舒服时因为互相不通常大概程序难题等等。最佳还问到了上线数据意况怎样(笔者老实的说正在最后调整,结束学业季才上线)

此间只能说一伊始的展现还足以呢,不过回看起来感到后半段本身有点不重视点,便是没有眉目,恐怕是深感压力了啊,加上自身认为多少虚,表面望着镇定,其实心里某些怂了。

 

推荐APP那里的话小编要么讲了初试讲的那多个,不过恐怕是情景不佳?真的感觉并未初试讲的知情【哭】。而且那个面试官对于作者说的APP好像不是很感兴趣,让自家再引进二个,小编那时候脑袋有点短路,所以超老实的说一代想不起来,作者看出手提式有线电话机。然后我说了《石墨文书档案》——大概嫌弃本身讲话有点绕而且没啥重点,小小妹让自家用多个词形容一下,作者想了很久憋出了多少个词“实时,简洁,精致”——最终一个词“高效”在当下纵然想不到,只好拿精致代替,面试之后才想到真的是无语了。

 

实际上能感到出来面试官立小学三嫂很想和作者聊一些共同话题,所以他问小编有没有横跨墙用过facebook/ins什么的,小编也超级老实的说,曾经用过免费的vpnFQ,但是网速什么太慢了,而且刚开首看的时候找不到乐趣就重回了墙里。【其实那里能够说说室友用facebook的感觉,太老实了太老实了】

 

故此觉得面试官好像有些失望,就问了最后一个题材“有何要问小编的吗?”

 

而自笔者这时候想想正处在二个抽风状态,其实很明朗,小编想问用户体验和产品合计的标题,可是咨询在此以前作者喜爱引入一下,然后就讲了讲了和睦的经验,然后……作者就忘了自笔者是在问难题啊!!!

 

面试官后来就短路本身,说时间有限,问难点啊【小编这一个时候才反应回来,哭死】,赶紧把想问的问了,希望得以挽救一下。

 

自家问的题目是:

  1. 用作产品的初学者把重点方向放在用户体验上有没有标题?
  2. 如何练习自身的生意思维?

 

面试官还是很耐心的回答了本身,也给自家有的建议,作者记下提出的时候,内心充满了悔恨QAQ【真是个猪脑子噗】

 

从而此次止步于复试了,但累计复试时获得最大的:

  1. 面试前最棒睡一觉,调整到最棒状态!
  2. 作为1个打算走产品的人,仍旧要时时FQ出去看看,无法局限在墙内——究竟国外众多出品的确很好,尤其是既然报了SNG事业群,国际上最资深的应酬的产品甚至都没用过,真的不应当。
  3. 问怎么答什么,不要回答着应对着就自由了自家QAQ
  4. 越来越多的用产品经营的意见看产品,学会总计,废话不要太多
  5. 系统条理条理~

 

到近年来截至,从前三个月的下结论算是写完了,仅用来自自己督促和劝说吧。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website