使用Runnable接口创建线程,很简单
大家好,今天分享.使用Runnable接口创建线程
首先Java创建线程可以通过三种方法:
即:
1.继承Thread类创建线程类(重点)
2.通过Runnable接口创建线程类(重点)
3.通过Callable接口(了解即可)
今天,使用Runnable接口创建线程。
步骤:
1.定义MyRunnable类实现.Runnable接口
2.创建run()方法,编写线程执行体
3.创建线程对象,调用start()方法启动线程
package Demo01;public class Thread03 implements Runnable{// 创建线程的第二种方式:
//
// 1.实现Runnable接口//2.重写run()方法,编写线程执行体//3.创建线程对象,调用start()方法启动线程public void run() {//run方法线程体for (int i = 0; i < 400; i++) {System.out.println("我在吃饭"+i); //输出的信息}}public static void main(String[] args) { //这里是主线程Thread03 thread03 =new Thread03(); //创建Runnable接口的实现类对象Thread thread =new Thread(thread03); //创建线程对象,通过线程对象来启动线程thread.start(); //开启线程for (int i = 0; i < 300; i++) {System.out.println("多线程"+i);}}
}
它的执行结果:
解释:
1.它的执行结果和 Thread继承的效果是一样的
2.调用start()方法启动线程: 结果就是线程以交替同时启动
这里还有注意点:
这两行代码(注意)
// Thread thread =new Thread(thread03); //创建线程对象,通过线程对象来启动线程// thread.start(); //开启线程
它等效于下面这一行代码:
new Thread(thread03).start();
整体代码在下面:
package Demo01;public class Thread03 implements Runnable{// 创建线程的第二种方式:
//
// 1.实现Runnable接口//2.重写run()方法,编写线程执行体//创建线程对象,调用start()方法启动线程public void run() {//run方法线程体for (int i = 0; i < 400; i++) {System.out.println("我在吃饭"+i); //输出的信息}}public static void main(String[] args) { //这里是主线程Thread03 thread03 =new Thread03(); //创建Runnable接口的实现类对象// Thread thread =new Thread(thread03); //创建线程对象,通过线程对象来启动线程// thread.start(); //开启线程new Thread(thread03).start(); //它等效上面两行被注释掉的代码for (int i = 0; i < 300; i++) {System.out.println("多线程"+i);}}
}
这是它的执行结果:(它是一样的效果)
它是一样的效果
下面我们使用Runnable接口的方式来实现之前的Thread实现下载图片:
看源码:
package Demo02;import org.apache.commons.io.FileUtils;import javax.imageio.IIOException;
import java.io.File;
import java.io.IOException;
import java.net.URL;public class ThreadTest implements Runnable { //这一行要注意private String url;private String name;public ThreadTest(String url, String name) {this.url = url;this.name = name;}@Overridepublic void run() {WebDownloader webDownloader = new WebDownloader();webDownloader.downloader(url, name);System.out.println("下载之后文件名是:" + name);}public static void main(String[] args) {ThreadTest k1 = new ThreadTest("https://img-home.csdnimg.cn/images/20220218094038.jpg ", "1.jpg");ThreadTest k2 = new ThreadTest("https://img-home.csdnimg.cn/images/20220218094038.jpg ", "2.jpg");ThreadTest k3 = new ThreadTest("https://img-home.csdnimg.cn/images/20220218094038.jpg ", "3.jpg");new Thread(k1).start(); //这是我们改动的地方new Thread(k2).start();new Thread(k3).start();}
}class WebDownloader{public void downloader(String url,String name){try {FileUtils.copyURLToFile (new URL(url),new File(name));} catch (IOException e) {e.printStackTrace();System.out.println("io异常,downloader方法异常");}}
}
看结果:
就是这样的
总结:
继承Thread 类
子类继承Thread类具有多线程能力
启动线程: 子类对象.start()
不建议使用:
OOP单继承有局限性
实现接口Runnable具有多线程能力
启动线程:传入目标对象+Thread对象.start ()
推荐使用:避免单继承局限性,灵活方便,方便同一对象被多个线程使用
好了,有关于使用Runnable接口创建线程就到这里了,谢谢大家
使用Runnable接口创建线程,很简单相关推荐
- Java多线程(2)--Thread类继承和Runnable接口创建线程
Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现. Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run() ...
- java基础 通过继承Thread类和实现Runnable接口创建线程
java 创建线程 Java中,线程也是一种对象,但不是任何对象都可以成为线程. 只有实现了Runnable接口或继承了Thread类的对象才能成为线程. 继承Thread类 //格式: class ...
- 线程的应用-实现Runnable接口创建线程
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口 public class MyThread extends OtherClass ...
- Java用Callable接口创建线程
一.概述 使用Callable接口创建线程能够返回数据.与Runnable接口创建线程的方式有点类似,也是需要通过Thread类来创建线程.由于Thread类的构造函数中没有Callable接口, ...
- 通过实现Runnable接口创建,开启,休眠和中断线程。
** 通过实现Runnable接口创建,开启,休眠和中断线程. ** 1.创建线程 在Android中,提供了两种创建线程的方法,一种是通过Thread类的构造方法创建线程对象,并重写run()方法实 ...
- Java实现Runnable接口创建多线程
Java实现Runnable接口创建多线程 通过继承Thread类,实现多线程,但是,这种方式有一定的局限性,因为,Java中只支持单继承,一个类一旦继承了某个父类,就无法再继承Thread类 比如, ...
- java多线程------实现Runnable接口创建多进程,实现资源共享
//实现Runnable接口创建多进程,实现资源共享 package xian_cheng;public class Example05 {public static void main(String ...
- java实现Runnable接口启动线程
这里写自定义目录标题 java实现Runnable接口启动线程 重写run方法 java实现Runnable接口启动线程 重写run方法 run方法里面装需要执行的代码块 @Override publ ...
- 实现runable接口创建线程
package com.learn;class ThreadDemo02 implements Runnable {public void run() {for (int i = 0; i < ...
最新文章
- 大话RxJava:一、初识RxJava与基本运用
- 【知识星球】卷积核和感受野可动态分配的分组卷积
- conda使用报错:ImportError:DLL load failed
- window访问不到linux的activemq_springboot整合开源项目测试拦截接口访问的频率
- DOTNET Core MVC(二)路由初探
- 我的网络安全第三次实验汇报
- 【Computer Organization笔记12】流水线技术概述
- (专升本)Internet(计算机网络系统)
- android 9指纹认证_Android指纹认证教程
- Typescript - enum 枚举类型(数值型枚举 / 字符串枚举 / 常量枚举 / 异构枚举 / 计算枚举成员 / 联合枚举和枚举成员类型 / 运行时的枚举 / 环境枚举 / 对象与枚举)教程
- iOS中常用的几种延时加载/执行的处理办法
- 高德vue-amap使用(一)标记点位获取地址及经纬度
- c语言动态与静态分配内存空间的区别
- 如果电脑蓝屏0xc000021a怎么办
- 基于物理的渲染PBR(一):pbr的基础理论和推导
- JavaScript的入门(下)
- 山东师大计算机专业研究生,山东师范大学现代教育技术(专硕)专业考研难度分析-专业排名-难度大小...
- 深度学习工程应用快速入门
- 【渝粤教育】电大中专电子商务网站建设与维护 (15)作业 题库
- C++STL中vector容器 assign()函数的用法
热门文章
- 鲜为人知的MySQL语法介绍(210629+NULLIF())
- 画好高中男生校服有哪些技巧?
- SAP-HANA-S4相对ECC财模块变化点介绍
- P2522 [HAOI2011]Problem b (莫比乌斯反演)
- vscode配置用户代码片段(快捷键自定义代码模板)
- oracle行转列、列转行
- AIDAS原理(转载)
- 聊聊 dotnet 7 对 bool 与字符串互转的底层性能优化
- 【豆瓣电影】2019/11/21/Python搜索豆瓣电影(Top100)爬虫+D3.js词云(票房和豆瓣评分)实现
- 东芝为何无法成为通用电气?日媒:或在于赚钱方法