Day10 callable的使用,lambda表达式

Day10

多线程

callable

callable使用方法整体和Thread的使用方法类似,需要子类继承callable接口,并且重写call方法而不再是run方法。

而在实例时,Thread可以直接用start方法启动

callable则需要用四步来完成,

//创建执行服务
ExecutorService ser= Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> result1=ser.submit(demo01);
Future<Boolean> result2=ser.submit(demo02);
Future<Boolean> result3=ser.submit(demo03);
//获取结果
boolean r1=result1.get();
boolean r2=result2.get();
boolean r3=result3.get();
System.out.println(r1);
System.out.println(r2);
System.out.println(r3);
//关闭服务
ser.shutdown();

很明显这是用一个线程池来完成,和以前python写爬虫用到的多线程也是用线程池来写的。

Callable的好处

  • 可以定义返回值
  • 可以跑出异常

静态代理模式

public class StaticProxy {
    public static void main(String[] args) {
        ProxyMarry proxyMarry = new ProxyMarry(new Me());
        proxyMarry.HappyMarry();
    }

}
interface Marry{
     void HappyMarry();
}
class Me implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("。。。结婚中。。。");
    }
}
class ProxyMarry implements Marry
{
    Marry target;

    public ProxyMarry(Marry target) {
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        target.HappyMarry();
        after();
    }

    private void after() {
        System.out.println("。。。结婚后。。。");
    }

    private void before() {
        System.out.println("。。。结婚前。。。");
    }
}

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

代理对象可以做很多真实对象做不了的事。

真实对象就可以专注做自己的事情。

new Thread(()->System.out.println("我爱你")).start();

静态代理就是Thread, 比如上图的代理公司。

Lambda表达式

是为了简化代码,上面的就是lambda表达式的方式 属于函数式编程

避免匿名内部类定义过多,可以让代码变的更简洁,去掉了没有意义的代码,只留核心的逻辑。

函数式接口

内部只有一个抽象方法,两个方法就不是函数式接口。

而有函数式接口,就能用lambda表达式创建对象。

静态内部类只需要在前面加一个static即可

局部内部类放到方法里面

匿名内部类,没有类的名称,借助接口或者父类来完成

lambda表示化简

lambda表达式化简所以

like=()->{System.out.println(" lambda")};

化简的是函数式接口的表达。

然后再调用这个接口的函数即可

(参数)->{代码块};//不写方法名和继承类名

简化后,括号,花括号,参数类型都可以不写

a->代码;就是lambda表达式。花括号不写的前提是只有一个语句,而如果代码块有很多条语句就需要加上花括号。

多个参数也可以去掉参数类型,如果去掉,所有都要去掉。 但是必须要加括号。

而正好Runnable接口只有一个方法,就是run方法,可以用lambda方法来表示。

线程的五大状态

创建 就绪 阻塞 运行 死亡 五大状态。

线程停止

线程停止建议线程正常停止->利用次数,不建议使用死循环

建议使用标志位

不要使用stop和destroy等过时的方法。

通过一个自己写的方法来使线程终止。

思考

今天学习多线程的callable操作是利用线程池的方法来启动的,其他都和Thread类似,方法则是call,以及静态代理模式用来Thread。

和lambda表达式,来快捷化简的表达函数式接口的一个方法。以及线程停止,我最开始用的线程停止是用interrupt方法,由于不知道,所以应该选择更安全的方法来使线程停止。

posted @ 2022-09-24 22:21  青山隐隐丶  阅读(294)  评论(0编辑  收藏  举报