当前位置: 首页 > news >正文

多线程知识-11

Runnable 和 Thread 用哪个好

使用Runnable接口的好处是:

  1. 避免了单继承的限制:当你的类已经继承了另一个类时,你仍然可以实现Runnable接口来创建线程。
  2. 提高代码的复用性:你可以将Runnable对象传递给多个线程来执行,从而实现代码的复用。
  3. 适合资源共享:多个线程可以共享同一个Runnable对象,从而实现对同一个资源的访问。

使用Thread类的好处是:

  1. 简单直观:Thread类提供了一些常用的方法,如start()、sleep()等,可以更方便地控制线程的执行。
  2. 可以直接继承Thread类来创建线程,不需要实现接口。

   如果你的类已经继承了另一个类,或者需要与多个线程共享资源,那么使用Runnable接口是一个更好的选择。如果你只需要简单地创建一个线程并执行任务,可以直接继承Thread类。

 notify 和 notifyAll 有什么区别

     在 Java 中,notify() 和 notifyAll() 都是 Object 类中的方法,用于唤醒等待在当前对象上的线程。区别在于:

  1. notify() 方法会唤醒在对象的等待池中等待时间最长的一个线程,该线程将进入可运行状态,但并不能立即获得锁资源。如果有多个线程等待,则只有一个线程能被唤醒。
  2. notifyAll() 方法会唤醒所有在对象的等待池中等待的线程,所有线程都将进入可运行状态,但并不能立即获得锁资源。

下面是一个例子,通过 synchronized、wait()、notify() 方法演示了 notify() 和 notifyAll() 的区别:

public class NotifyExample {public static void main(String[] args) {Message message = new Message();Thread thread1 = new Thread(new Waiter(message), "Waiter1");Thread thread2 = new Thread(new Waiter(message), "Waiter2");Thread thread3 = new Thread(new Notifier(message), "Notifier");thread1.start();thread2.start();thread3.start();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}message.setReady(true);synchronized (message) {message.notify(); // 唤醒等待时间最长的一个线程}}
}class Message {private boolean ready;public boolean isReady() {return ready;}public void setReady(boolean ready) {this.ready = ready;}
}class Waiter implements Runnable {private final Message message;public Waiter(Message message) {this.message = message;}@Overridepublic void run() {synchronized (message) {try {if (!message.isReady()) {System.out.println(Thread.currentThread().getName() + ": 正在等待消息...");message.wait();}} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ": 收到消息!");}}
}class Notifier implements Runnable {private final Message message;public Notifier(Message message) {this.message = message;}@Overridepublic void run() {synchronized (message) {System.out.println(Thread.currentThread().getName() + ": 准备通知等待的线程");message.setReady(true);
//      message.notify(); // 使用 notify() 方法message.notifyAll(); // 使用 notifyAll() 方法}}
}

运行上述代码,结果会根据调用的 notify() 或 notifyAll() 方法而有所不同。如果使用 notify() 方法,则只有一个 Waiter 线程会被唤醒并继续执行;如果使用 notifyAll() 方法,则所有的 Waiter 线程都会被唤醒并继续执行。

总结

    在Java中,notify()和notifyAll()是用于线程间通信的方法。

  1. notify()方法:该方法用于唤醒在对象的等待池中等待的单个线程。如果有多个线程在等待,则随机选择一个线程被唤醒。被唤醒的线程将进入就绪状态,等待获取对象的锁。

  2. notifyAll()方法:该方法用于唤醒在对象的等待池中等待的所有线程。被唤醒的线程将进入就绪状态,等待获取对象的锁。notifyAll()相当于广播通知,通知所有等待的线程。

  3. Runnable接口:Runnable是一个函数式接口,用于定义一个可以被线程执行的任务。实现Runnable接口的类可以被传递给Thread类的构造方法,从而创建一个线程。Runnable接口只有一个run()方法,需要在该方法中定义线程的执行逻辑。

  4. Thread类:Thread类是Java中表示线程的类,可以通过继承Thread类或传递实现Runnable接口的对象来创建线程。Thread类提供了一些方法用于管理线程,如start()用于启动线程,sleep()用于使线程休眠,join()用于等待其他线程执行完毕等。

  • notify()和notifyAll()方法用于线程间通信,唤醒等待的线程。
  • Runnable接口用于定义一个可以被线程执行的任务。
  • Thread类是Java中表示线程的类,可以通过继承Thread类或传递实现Runnable接口的对象来创建线程。

相关文章:

  • 微信小程序登录接口
  • Prop 和 State 有什么区别?
  • AGP8+ android.useNewApkCreator‘ is deprecated 打包失败
  • Java进阶学习笔记36——算法
  • 浅谈IDEA中项目如何进行热部署
  • 实战16:基于apriori关联挖掘FP-growth算法挖掘关联规则的手机销售分析-代码+数据
  • 秦岚:结了婚就不要离婚了
  • idea项目maven下载依赖报错
  • YOLOv10:实时端到端目标检测的新突破
  • Springboot vue elementui 前后端分离 事故灾害案例管理系统
  • VS2015 +Qt 新建单元测试工程报错error LNK2019,error LNK2001: 无法解析的外部符号 WinMain
  • 安卓玩机搞机技巧综合资源----电脑控制手机 投屏操控的软件工具操作步骤解析【二十二】
  • 开源协议及静态链接和动态链接
  • 最新版点微同城源码34.7+全套插件+小程序前后端
  • 学习小心意——简单的循坏语句
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Apache Spark Streaming 使用实例
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript的使用你知道几种?(上)
  • leetcode386. Lexicographical Numbers
  • Python学习之路16-使用API
  • Ruby 2.x 源代码分析:扩展 概述
  • 工作手记之html2canvas使用概述
  • 官方解决所有 npm 全局安装权限问题
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端攻城师
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • "无招胜有招"nbsp;史上最全的互…
  • %check_box% in rails :coditions={:has_many , :through}
  • (1)常见O(n^2)排序算法解析
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (四)opengl函数加载和错误处理
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (译) 函数式 JS #1:简介
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .gitignore不生效的解决方案
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • ??在JSP中,java和JavaScript如何交互?
  • @JoinTable会自动删除关联表的数据
  • [C#] 我的log4net使用手册
  • [c++刷题]贪心算法.N01
  • [codevs] 1029 遍历问题
  • [CP_AUTOSAR]_分层软件架构_接口之通信模块交互介绍
  • [CSS]浮动
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例