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

Runnable

概念

如果你的某个实例的方法想要被线程执行,那么可以通过实现Runnable接口,重写Runnable的run方法,这个方法是个无入参无返回值的方法,然后将你这个实例作为Thread的构造器参数去执行

Runnable与Thread的关系

Thread本身就是Runnable的实现类,且Thread本身维护一个Runnable类型的引用target,通过对构造器传入一个Runnable的实现类对象为这个引用target赋值,Thread通过start()方法启动这个线程实例对象,这个命令是操作系统层级的名称,这个命令可以创建一个线程,这个线程会去执行这个实例对象的Runnable接口的重写方法run,而这个方法的内容是调用target的run方法,Thread类简写如下

public class Thread implements Runnable {private Runnable target;public Thread(Runnable target) {this(null, target, "Thread-" + nextThreadNum(), 0);}public synchronized void start() {start0();}public synchronized void stop() {stop0();}private native void start0();private native void stop0(Object o);@Overridepublic void run() {if (target != null) {target.run();}}
}

案例代码

class MyRun implements Runnable{@Overridepublic void run() {for (int i = 0; i < 3; i++) {//线程名(默认):Thread-0,currentThread是获取当前的线程System.out.println(Thread.currentThread().getName() + i);}}
}public class ThreadTest {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(new MyRun());thread.setName("mythread");thread.start();System.out.println("========以下是main线程的执行步骤========");for (int i = 0; i < 3; i++) {System.out.println(Thread.currentThread().getName()+":"+i);}}
}

使用Runnable的好处

//program--Thread
public class Test {public static void main(String[] args) {// TODO Auto-generated method stubnew MyThread().start();new MyThread().start();}static class MyThread extends Thread{private int ticket = 5;public void run(){while(true){System.out.println("Thread ticket = " + ticket--);if(ticket < 0){break;}}}}
}
//program--Runnable
public class Test2 {public static void main(String[] args) {// TODO Auto-generated method stubMyRunnable mt=new MyRunnable();new Thread(mt).start();new Thread(mt).start();}static class MyRunnable implements Runnable{private int ticket = 5;public void run(){while(true){System.out.println("Runnable ticket = " + ticket--);if(ticket < 0){break;}}}}
}

使用Runnable接口可以更好的体现面向对象编程的思想,把任务和线程分离开来。任务可以看作是一个对象,而线程可以看作是该对象的执行者。这样就可以更好的实现模块化设计,提高代码的可重用性和可维护性。

使用Runnable接口可以更好地处理多个线程之间的交互和协作。因为Runnable实例可以作为参数传递给Thread构造函数,线程可以共享同一个Runnable实例,并且多个线程可以同时执行同一个Runnable实例的不同方法,从而实现多个线程之间的交互和协作。总的来说,使用Runnable接口的方式更加灵活和通用,可以实现更多的多线程编程场景,更好的体现面向对象编程的思想,提高代码的可重用性和可维护性

使用Runnable接口可以在多线程之间共享类的实例对象,比如本类中的ticket,因为多个thread执行的都是MyRunnable的run方法,而对于继承Thread的方式,因为每个thread都是执行的自己的run方法,所以ticket对于每个thread实例而言都是隔离的,如果需要共享的话那就需要把ticket设置为静态变量

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flutter-->Widget上屏之路
  • git cherry-pick 合并单个提交
  • 【OSCP系列】OSCP靶机-Dawn1(原创)
  • ESP32 出现 failed to load RF 报错
  • 高级java每日一道面试题-2024年8月25日-框架篇[Spring篇]-Spring框架中请举例解释@Required注解?
  • 从头到尾快速学习一遍Linux,高级工程师多年实践实战经验精华总结和实例示例,第四章:高阶使用
  • 云计算实训30——自动化运维(ansible)
  • Javascript——JSDoc 风格的注释语法 为参数添加说明
  • <数据集>斯坦福狗狗识别数据集<目标检测>
  • 面向对象09:instanceof和类型转换
  • 华为数通方向HCIP-DataCom H12-821题库(更新单选真题:1-10)
  • Spring中的AopUtils
  • <C++> 二叉树进阶OJ题
  • C++ JAVA源码 HMAC计算 openssl 消息认证码计算 https消息防篡改 通信安全
  • Vulkan 学习(6)---- vkBuffer 创建
  • [译]CSS 居中(Center)方法大合集
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 2017 年终总结 —— 在路上
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • AngularJS指令开发(1)——参数详解
  • es6(二):字符串的扩展
  • Git 使用集
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JavaWeb(学习笔记二)
  • Java新版本的开发已正式进入轨道,版本号18.3
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MD5加密原理解析及OC版原理实现
  • Promise初体验
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spring框架之我见(三)——IOC、AOP
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • ubuntu 下nginx安装 并支持https协议
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 测试开发系类之接口自动化测试
  • 初识 beanstalkd
  • 番外篇1:在Windows环境下安装JDK
  • 那些年我们用过的显示性能指标
  • 前端自动化解决方案
  • 微信公众号开发小记——5.python微信红包
  • 小程序button引导用户授权
  • 在weex里面使用chart图表
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ‌移动管家手机智能控制汽车系统
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • ${factoryList }后面有空格不影响
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Java数据结构)ArrayList
  • (solr系列:一)使用tomcat部署solr服务
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (翻译)terry crowley: 写给程序员