首页 > 其他分享 >匿名内部类、Lambda表达式 应用于创建线程

匿名内部类、Lambda表达式 应用于创建线程

时间:2024-11-12 15:46:17浏览次数:3  
标签:Runnable run Thread 接口 匿名 线程 Lambda

匿名内部类的几大作用:

1.完成接口实现关系 完成类继承关系

2.方法重写

3.创建对象

而Lambda表达式的作用:主要用于实现函数式接口,即用于实现单一抽象方法接口。

所以可以用Lambda表达式实现的函数式接口都可以转换成匿名内部类的形式。

方式一

Thread t = new Thread(){ //匿名内部类  
    public void run(){  
        pong();  
    }  
};

在这种方式中,你直接扩展(继承)了Thread类,并重写了它的run方法。然后,你创建了这个匿名内部类的一个实例,并将其赋值给Thread类型的变量t。当你调用t.start()时(虽然在你的代码示例中没有显示调用start(),但通常这是启动线程的方式),JVM会为这个线程分配资源,并调用你重写的run方法。

方式二

Thread t = new Thread(new Runnable() {  //匿名内部类
    @Override  
    public void run() {  
        pong();  
    }  
});

在这种方式中,你并没有直接扩展Thread类,而是创建了一个实现了Runnable接口的匿名内部类的实例。这个匿名内部类实现了Runnable接口的run方法。然后,你创建了一个Thread类的实例,将你的Runnable实例作为参数传递给Thread的构造函数。当你调用t.start()时,JVM同样会为这个线程分配资源,但这次它会调用你传递给Thread构造函数的Runnable实例的run方法。

Lambda表达式

Thread t1 = new Thread(() -> {    
    pong();
});

这个Lambda表达式是通过实现Runnable接口(特别是实现其run方法)来转换以创建线程的。这是创建线程时使用的方式二

两者区别

  1. 继承与实现:第一种方式通过继承Thread类来创建线程,而第二种方式通过实现Runnable接口来创建线程。通常,如果你不需要扩展Thread类(因为Java不支持多重继承),或者你的类已经继承了另一个类,那么实现Runnable接口是更好的选择。
  2. 灵活性:实现Runnable接口提供了更多的灵活性,因为你可以让你的类实现多个接口,但只能继承一个类。
  3. 资源共享:在Java中,每个线程都有其执行上下文,包括一组输入/输出流和错误流。当你继承Thread类时,这些资源会自动与你的线程关联。然而,如果你实现Runnable接口,则不会自动获得这些资源,但你可以通过其他方式(如传递参数)来共享这些资源。
  4. 线程池:当你使用Runnable接口时,可以更容易地将任务提交给线程池执行,因为ExecutorService接口要求提交Runnable或Callable任务,而不是Thread实例。

总的来说,虽然这两种方式在功能上是等价的,但在实际开发中,实现Runnable接口通常是更受欢迎的选择,因为它提供了更多的灵活性和与Java并发API的兼容性。

标签:Runnable,run,Thread,接口,匿名,线程,Lambda
From: https://blog.csdn.net/m0_73753865/article/details/143716323

相关文章

  • 创建线程池有哪几种方式
       Java中常见创建线程池的几种方法。1.使用​​Executors​​工具类创建线程池​​newFixedThreadPool(intnThreads)​​特点:创建一个固定大小的线程池,线程池中的线程数始终保持不变。适用场景:适用于任务量已知且相对固定的场景,可以有效控制资源的使用。​​ne......
  • 创建线程池有哪几种方式
      Java中常见创建线程池的几种方法。1.使用​​Executors​​工具类创建线程池​​newFixedThreadPool(intnThreads)​​特点:创建一个固定大小的线程池,线程池中的线程数始终保持不变。适用场景:适用于任务量已知且相对固定的场景,可以有效控制资源的使用。​​newSi......
  • Mit6.S081笔记Lab7: Multithreading 多线程
    课程地址:https://pdos.csail.mit.edu/6.S081/2020/schedule.htmlLab地址:https://pdos.csail.mit.edu/6.S081/2020/labs/thread.html我的代码地址:https://github.com/Amroning/MIT6.S081/tree/threadxv6手册:https://pdos.csail.mit.edu/6.S081/2020/xv6/book-riscv-rev1.pdf相......
  • Java面试之多线程&并发篇
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!如何停止一个正在运行的线程?notify()和notifyAll()有什么区别?sleep()和wait()有什么区别?volatile是什么?可以保证有序性吗?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***如......
  • 深入理解Java线程池:线程任务完成检测的原理与实现
    在Java中,线程池(ThreadPool)是用于管理和复用线程的机制,通过它可以高效地管理多线程任务。一个常见的问题是:线程池是如何知道某个线程的任务已经完成的?本篇文章将深入探讨线程池任务完成的检测原理,并结合代码示例,让大家深入理解线程池的工作方式。推荐正在找工作的朋友们:就......
  • Java Lambda表达式与函数式接口和Stream API的常用方法
    JavaLambda表达式常与函数式接口和流(StreamAPI)一起使用,提供了非常强大的方式来处理集合和其他数据结构。以下是一些常用的Lambda表达式方法和它们的用途,特别是在结合java.util.stream.Stream时:1.map()用途:用于将流中的每个元素转换成另一种形式。示例:List<String>name......
  • 线程进阶篇4:如何用Executors工具类创建线程池-代码演示-源码分析-可行性分析,对比new T
        本篇文章主要是讲解如何使用Executors工具类创建线程池,看本篇之前建议同学们先去看看我发布的上一篇文章,即用newThreadPoolExecutor()来创建线程池,里面讲解了线程池的参数使用方法和场景,熟悉了之后再来学习这一篇会更容易理解一些!因为Executors只是一个工具类,底层......
  • 多线程锁的升级原理是什么
      锁的级别:无锁=>偏向锁=>轻量级锁=>重量级锁 无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个线程能成功修改资源,其他的线程会不断尝试,直至修改成功。  偏向锁:偏向锁是指当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储线程ID。一旦该......
  • 多线程锁的升级原理是什么
      锁的级别:无锁=>偏向锁=>轻量级锁=>重量级锁 无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个线程能成功修改资源,其他的线程会不断尝试,直至修改成功。  偏向锁:偏向锁是指当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储线程ID。一旦该......
  • 创建线程有哪几种方式
    1.继承​​Thread​​类优点:简单直观,适合初学者。直接继承​​Thread​​类,可以方便地访问和使用​​Thread​​类的方法。缺点:Java不支持多继承,因此如果你的类已经继承了其他类,则不能继承​​Thread​​类。仅适用于简单的线程任务。示例:classMyThreade......