首页 > 其他 > 详细

从new Thread说起

时间:2021-09-16 07:20:11      阅读:18      评论:0      收藏:0      [点我收藏+]

有这么个困惑,开启线程不都是继承Thread或重写runnable吗?为什么我是直接new的?这和new A(100)有什么区别?A(100)存的是变量啊为什么这里是‘函数‘?

new Thread(()->{
            System.out.println(666);
        }).start();

这里的本质是相当于new Thread(new Runnbale())
事实上,对于Thread确实是new。里面这个函数则是等于new了个Runnable

最原始写法

//原始写法
class MyRunnable implements Runnable{

    @Override
    public void run() {
        System.out.println(666);
    }
}
//然后调用是这样的
new Thread(new MyRunnable()).start();

匿名内部类

但是上面的太麻烦 ,每次都要显示实现接口,单独创一个类就很累
就赋予new新功能,让它至少封装在一步
形式为 new A(){} 在{}里面重写方法

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(666);
            }
        }).start();

总结一下,简化流程大概是这样的,所以也叫“函数式编程”,纯粹的面向功能,直观形象
技术分享图片

进阶

数组排序,倒序。

Arrays.sort(new Integer[]{1,2,3,4,19,0},(a,b)-> b-a);

很简洁,这里要实现的其实就一个Compartor比较器
点开源码,就一个方法
技术分享图片
不熟的话可以从v1写起,大概就是这样
技术分享图片

注意的三个点:

  1. 不能使用int[],没法比较,要用对象
  2. 实现Comparator的时候要加泛型,不然默认是obj,obj直接不能直接-操作
  3. 其实Comparator中除了默认和静态方法,还有一个额外的equals方法。按理来说函数式接口只有一个方法,但由于equals是重写父类obj的所以不算

总结

三步走:自己实现接口 >> 匿名内部类 >> lamda
可以看到lamda确实很方便,甚至高效(v1或者v2都需要泛型)

从new Thread说起

原文:https://www.cnblogs.com/purexww/p/15265878.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!