Java多线程笔记02

目录

4.静态代理模式

5.Lambda(λ)表达式

(1)理论

 (2)代码实例(顺便复个习):

(3)进一步的简化:

6.线程状态

(1)五大状态:

 (2)线程停止

 (3)线程休眠

 实例1:

 实例2:

 (4)线程礼让

实例

 (5)线程强转执行

 (6)线程状态观察

实例:

 7.线程优先级

 8.守护线程


4.静态代理模式

例子,婚庆公司:

代码:

 

结果:

 静态代理模式小结:

真实对象和代理对象都要实现同一个接口;代理对象要代理真实角色。

好处:代理对象可以做很多真实对象不能做或者不方便做的事情;真实对象专注于自己的事情。

(比如我可以把布置婚礼,付尾款给到You这个真实对象,但是这样从程序设计的角度来看,这两个功能和You这个类的内聚性不强,关系不是很大,而且如果写一个You这一年的事情,那么这两个功能仅仅在婚礼上用一次,显然是不太好的,尤其是当我们开启多线程的时候,每个You的对象都这样做,那显然是比较难看的设计模式)

 PS:Thread也是实现了runnable接口,代理了runnable,下面两个本质是一样的 

5.Lambda(λ)表达式

(1)理论

 

 

 (2)代码实例(顺便复个习):


/*推导一个lamda表达式*/
public class Lamdada {
    //3.静态内部类
    static class Like2 implements ILike {
        @Override
        public void lambda() {
            System.out.println("2");
        }
    }


    public static void main(String[] args) {
        //方法一:一个接口,一个实现类,再调用,显然略显麻烦
        ILike like = new Like();
        like.lambda();
        //方法二:静态内部类
        like = new Like2();
        like.lambda();

        //4.局部内部类
        class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println("3");
            }
        }

        //方法三:局部内部类
        like=new Like3();
        like.lambda();

        //5.匿名内部类,没有类的名称,必须借助接口和父类
        like=new ILike() {
            @Override
            public void lambda() {
                System.out.println("4");
            }
        };

        //方法四:匿名内部类
        like.lambda();

        //方法五:用lambda简化
        like=()->{
            System.out.println("5");
        };
        like.lambda();
    }
}

//1.定义一个函数式接口
interface ILike {
    void lambda();
}

//2.实现类
class Like implements ILike {

    @Override
    public void lambda() {
        System.out.println("1");
    }
}

接口只有一个类

 这2篇文章可以看一下:Java Lambda 表达式 | 菜鸟教程

Java语法—— Lambda表达式_何翰宇的博客-CSDN博客_java lambda表达式

(3)进一步的简化:

 而在多线程中,由于runnable接口只有一个run抽象方法,也可以是函数式的,可以用Lambda简化。

6.线程状态

(1)五大状态:

 

 (2)线程停止

 实例:

 

 (3)线程休眠

 实例1:

 那么我们知道多个对象同时操作一个资源不安全,那可能一下子发现不了(尤其调度是cpu来做的),那我们可以通过模拟网络延时来放大问题的发生性,从而发现问题,再解决问题:

比如这里的结果就有点不对了:

 实例2:

模拟10秒倒计时

 

 

 (4)线程礼让

 

比如有a,b两个线程准备进入,cpu让a先进入,然后代码让a礼让,那么还是回到a,b两个线程准备进入的状态,cpu再调度可能是a进入,也可能是b进入。

实例


//测试礼让线程
//礼让不一定成功,看cpu心情
public class TestYield {
    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread( myYield,"a").start();
        new Thread( myYield,"b").start();
    }
}


class MyYield implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"  线程开始");
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"  线程停止");
    }
}

这是礼让成功的结果:

 (5)线程强转执行

 实例

 (6)线程状态观察

实例:

 

 结果:

wait(阻塞)是因我们写了5秒的延迟,不然计算机太快了,都打印不出来

 /就是这个线程的所有任务,之后就停止

 7.线程优先级

 这里t5,t6会报错,因为只有1-10

 去掉t5,t6的结果:

thread3是t4,它优先级最高

 

 但是,这不绝对,并不一定每次都是优先级高的先跑(性能倒置),不过一般是这样的

 8.守护线程

 main就是用户线程,gc(垃圾)是守护线程

 这样就能创建守护线程,和之前正常的用户线程就多了一个这个setDarmon 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值