线程实现的两种方式
时间:2020-05-23
本文章向大家介绍线程实现的两种方式,主要包括线程实现的两种方式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
线程实现的两种方式
因为cpu的调度不可控, 所以每次执行的结果可能不同
main
方法也是一个线程
继承Thread
类
Thread 类
常用构造方法
方法 | 说明 |
---|---|
Thread() | 无参构造 |
Thread(Runnable target) | 传入一个继承了Runnable 接口的对象 |
常用方法
修饰符和返回值 | 方法 | 说明 |
---|---|---|
static Thread | currentThread() | 返回对当前正在执行的线程对象的引用。 |
long | getId() | 返回该线程的标识符。 |
String | getName() | 返回该线程的名称。 |
void | run() | 一般每个线程要执行的代码都放在run()方法里, 注意: 直接执行 run() 相当于执行普通方法, 启动线程必须执行 start() |
void | setName(String name) | 设置线程名称 |
static void | sleep(long millis) | 线程休眠, 单位: 毫秒 |
void | start() | 使该线程开始执行 |
void | stop() | 停止该线程 |
代码示例
普通方法
public class Test1_Thread {
public static void main(String[] args) {
MyThread target = new MyThread();
// 执行run()...
// target.run(); // 可以执行业务, 但是没有多线程效果, 相当于普通方法
// 应执行start()启动线程
target.start(); // 从新建状态变成了可运行状态, 等待cpu调度
}
}
// 继承Thread类
class MyThread extends Thread {
@Override
public void run() {
// 线程执行的代码
}
}
匿名对象方式
new Thread(){
public void run() {
// 线程执行的代码
}
}.start();
实现Runnable
接口
Runnable接口
接口方法
返回值 | 方法 | 说明 |
---|---|---|
void | run() | 每个线程要执行的代码 |
代码示例
普通实现方式
public class Test2_Runnable {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行的代码
}
}
匿名内部类方式
Runnable r2 = new Runnable() {
public void run() {
// 线程执行代码
}
};
new Thread(r2).start();
// 以上代码可简写为
new Thread(new Runnable() {
public void run() {
// 线程执行代码
}
}).start();
lambad表达式
-
Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
-
JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。
对接口的要求: 虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法
这里只介绍Lambad表达式的接口用法, 详细用法请 点击这里
使用lambad表达式实现线程
Thread t2 = new Thread( () -> {
// 线程要执行的代码
// 如果执行的代码只有一行, 大括号可以省略
});
t2.start();
匿名内部类和匿名对象
-
匿名内部类: 不需要类名, new一个接口
众所周知, 接口不能被实例化, 但是new一个接口的代码是可行的, 但是, 这并不表示这个接口被实例化了, 而是实例化了一个没有名字的类. 如下代码: (以下代码和线程无关)
// main方法中的代码 new Runnable() { @Override public void run() { // 方法体 } };
实际上他是这样的
// 这个类在main方法中定义 class 匿名 implements Runnable { @Override public void run() { // 方法体 } } // 下面是main方法中的代码 new 匿名();
匿名内部类是一个一次性的类. 即: 这个类只能被实例化一次, 且这个类的方法也只能执行一次
-
匿名对象: 不需要变量, new一个对象
匿名对象 比如:
new Thread()
这样的, 一个没有名字的Thread
对象, 匿名对象是一个一次性的对象, 即: 这个对象只能存在一次.
原文地址:https://www.cnblogs.com/zpKang/p/12941172.html
- 简单、通用的JQuery Tab实现
- Dubbo源码解析 - 远程暴露
- 使用FastText(Facebook的NLP库)进行文本分类和word representatio...
- 声音分类的迁移学习
- 【死磕Java并发】—– J.U.C之AQS:CLH同步队列
- 使用Python完成你的第一个学习项目
- CA,给了数据库,给了机器,为啥也扩不了容?
- 如何使用Anaconda设置机器学习和深度学习的Python环境
- MQ,互联网架构解耦神器
- 预测随机机器学习算法实验的重复次数
- 服务化了,没想到耦合更加严重?
- 如何在Python中扩展LSTM网络的数据
- 使用Keras的Python深度学习模型的学习率方案
- 全球电脑手机无一幸免,英特尔CPU“漏洞事件”到底多严重?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter 实现下拉刷新上拉加载的示例代码
- [- C++趣玩篇1 -] 从打印开始说起
- Android实现蓝牙(BlueTooth)设备检测连接
- JQuery 入门学习(三)
- Android实现美团APP的底部滑动菜单
- 正则十八式-第二式:控鹤擒龙
- android实现手写签名功能
- [普及]程序自启动方式 - ActiveX
- Android WebView实现顶部进度条
- 通过一个简单的例子学习Angular Injection Token工作原理
- Android 自定义球型水波纹带圆弧进度效果(实例代码)
- Android自定义View实现弹幕效果
- 使用Injection Token将字符串类型的参数注入到类的构造函数里
- 联想Y480 ubuntu安装有线驱动
- 通过运行时单步调试弄清楚[(ngModel)]的双向绑定的工作原理