这节课里拓哥先是用一个例子来解释为何需要用到join
    而设计了第三个线程(ThreadThree)来锁定第二个线程,
    在two执行的过程里,one等待two的过程中,three将two对象锁定
    用了synchronized(two)关键字,来证明:
    一旦对象被synchronized锁定,
    在它不被释放的情况下,其他的对象都需要等待。
    但同时,这里有可能会产生一个死锁的效果,
    从而引入了【哲学家就餐】的例子来说明死锁有可能存在。
    image.png
    解决死锁的情况:
    1、产生时间差,让他们不在同一时间访问筷子
    2、不让对象被公用

    在课程的最后20分钟里,拓哥演示了Timer计时器(定时器)的线程相关小应用。
    它属于java.util包下的Timer类,用之前需要导包,快捷键:Alt+Enter

    1、通过无参数构造方法来创建对象
    2、用:↓↓↓↓↓↓↓↓↓↓↓
    timer.schedule(new TimeTask(){
    public void run() {
    System.out.println(“第”+count++ +”次发送”);
    for(int i = 0;i System.out.println(“给”+userBox.get(i)+”发送了一条消息:[呵呵哈哈嘿嘿嘿!!]”);
    }
    System.out.println(“呵呵,真好玩儿!”);
    }
    } , Date类型的firstTime , long类型的period毫秒);
    ↑↑↑↑↑↑↑↑↑↑ 方法作为一个线程来做定时器的实际执行。