Java基础:线程的三种创建方式
一、继承Thread类
- 定义一个类继承线程类Thread
- 重写run()方法
- 创建线程对象
- 调用线程对象的start()方法创建线程
Thread类的常用API
- setName(String name):给线程取名字
- getName():获取线程的名字
- public static Thread currentThread():获取当前线程对象,这个代码在哪个线程中就获取哪个线程对象
- public static void sleep(long time):让当前线程休眠多少毫秒再继续执行
优点:
- 编码简单
缺点:
- 线程类已经继承Thread就无法继承其他类了,功能无法通过继承拓展(单继承的局限性)
二、实现Runable接口
- 定义一个线程任务类实现Runable接口
- 重写run()方法
- 创建线程任务对象
- 把线程任务对象包装成线程对象
- 调用线程对象的start()方法启动线程
class MyRunable implements Runnable{
@Override
public void run() {
System.out.println("hello runable");
}
}
public static void main(String[] args) {
MyRunable target = new MyRunable();
Thread t = new Thread(target);
t.start();
}
优点:
- 避免了Java单继承的局限性
- 同一个任务对象可以被包装成多个线程对象
- 适合多个线程去共享同一个资源
- 实现解耦,线程任务代码可以被多个线程共享,线程任务代码和线程独立
- 线程池只能放入实现Runable和Callable接口的线程任务,不能直接放入继承Thread类的线程对象
缺点
- 编码复杂(其实还好啦)
匿名内部类的写法:
Runnable target = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类写法");
}
};
Thread t = new Thread(target);
t.start();
//简化
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类写法");
}
}).start();
//再简化
new Thread(() -> System.out.println("匿名内部类写法")).start();
三、实现Callable接口
- 定义一个线程任务类实现Callable接口,申明线程执行的结果类型
- 重写线程任务类的call方法,这个方法可以直接返回执行结果
- 创建一个Callable的线程任务对象
- 把线程任务对象包装成一个未来任务对象
- 把未来任务对象包装成线程对象
- 调用start()方法启动线程
//1.定义一个线程任务类实现Callable接口,申明线程执行的结果类型
class MyCallable implements Callable<String>{
//2.重写线程任务类的call方法,这个方法可以直接返回执行结果
@Override
public String call() throws Exception {
System.out.println("hello callable");
return "success";
}
}
//3.创建一个Callable的线程任务对象
Callable<String> call = new MyCallable();
//4.把线程任务对象包装成一个未来任务对象
//-- 未来任务对象其实就是一个Runable对象,这样就可以被包装成线程对象
//-- 未来任务对象可以在线程执行完毕后得到线程执行结果
FutureTask<String> future = new FutureTask<>(call);
//5.把未来任务对象包装成线程对象
Thread t = new Thread(future);
t.start();
//获取线程执行结果,如果线程还没执行完,让出CPU等线程执行完再来去结果
try {
String res = future.get();
System.out.println(res);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
优点:
- 拥有所有Runable的优点
- 能直接得到线程执行的结果
缺点:
- 编码复杂
Java基础:线程的三种创建方式的更多相关文章
- java中线程的三种实现方式
一下记录下线程的3中实现方式:Thread,Runnable,Callable 不需要返回值时,建议使用Runnable:有返回值时建议使用Callable 代码如下所示: package com.f ...
- java中线程的两种创建方式
第一种:继承java.lang.Thread类.然后重写run方法 例如我们模拟一个龟兔赛跑 1 package edu.aeon.thread; 2 3 /** 4 * 说明:模拟龟兔赛跑 5 * ...
- JAVA并发编程学习笔记------线程的三种创建方式
创建线程一般有如下几个方式: 1. 通过继承Thread类来创建一个线程: /** * 步骤1:定义一个继承Thread类的子类 * 步骤2:构造子类的一个对象 * 步骤3:启动线程: * */ pu ...
- Java实现线程的三种方式和区别
Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...
- [编程基础] C++多线程入门1-创建线程的三种不同方式
原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 1 创建线程的三种不 ...
- (转)Java结束线程的三种方法
背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...
- Java结束线程的三种方法(爱奇艺面试)
线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...
- 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)
线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...
- Struts2之命名空间与Action的三种创建方式
看到上面的标题,相信大家已经知道我们接下来要探讨的知识了,一共两点:1.package命名空间设置:2.三种Action的创建方式.下面我们开始本篇的内容: 首先我们聊一聊命名空间的知识,namesp ...
- JavaScript 闭包的详细分享(三种创建方式)(附小实例)
JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...
随机推荐
- 13、web 中间件加固-Nginx 加固
1.隐藏版本信息 避免被针对版本直接使用漏洞 修改 nginx.conf 文件 在 http 模块中添加信息:server_tokens off; 2.限制目录权限 某些目录为运维页面,不要公开访问 ...
- 自定义的基于System.Net.Http.HttpClient的WebClient,可以作为微信支付宝的发起请求时的基础请求类
个人编写的,自己用于自己的微信api的请求的实现当中,源码公开,大家可以查看反编译源码.以下是使用方法: 第一步 搜索和安装zmjtool 第二步 发起请求 1 /**引入命名空间*/ 2 using ...
- blazor优雅的方式导入组件相关的js脚本
基本的组件导入方式为: 1 await JsRuntime.InvokeVoidAsync("import", $"XXXXX.js"); 优雅的组件导入方式: ...
- BIN文件格式
BIN文件里面包含的只有代码生成的机器码,不像ELF文件或者obj文件一样还包含其他东西.MS-DOS.设备驱动文件以及操作系统的bootloader文件都是BIN文件. 在NASM中,BIN文件默认 ...
- 鸿蒙HarmonyOS实战-Stage模型(服务卡片介绍和运行机制)
一.服务卡片介绍 1.服务卡片的概念 在HarmonyOS中,服务卡片是一种提供即时信息和快速操作的小组件,类似于Android中的通知栏.服务卡片可以显示各种类型的信息,包括通知.天气.日历事件.音 ...
- 记一次asp.net 8 服务器爆满的解决过程
1.描述一下服务器配置: 一台2c4g的centos,做api接口反代 一台8c16g的windows 2019 作为实际服务器,跑了iis,sql server,mongodb,redis 2.业务 ...
- SwiftUI(一)- VStack、HStack、ZStack布局
SwiftUI是什么 懒得写,直接找了一篇博客: 初识 SwiftUI 三种布局 SwiftUI包括三种布局: VStack: 纵向布局,默认居中对齐 HStack: 横向布局,默认居中对齐 ZSta ...
- 高精度离线免费 的C#文字识别PaddleOCR库
随便打开一个Microsoft Visual Studio,新建一个WinForms项目,从下面列表中随便选择一个NET框架.目标平台要设置成X64,该OCR仅支持64位. net35;net40;n ...
- js 禁用右键菜单和禁止复制
大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...
- 浅谈ChatGPT模型中的惩罚机制
本文由ChatMoney团队出品 在探讨ChatGPT模型的文本生成能力时,除了采样算法,惩罚机制同样扮演着至关重要的角色.这些机制不仅影响生成文本的多样性和创意性,还为我们提供了调整文本风格和质量的 ...