Java多线程 实例解析
发布时间 - 2026-01-11 00:36:58 点击率:次Java多线程实例 3种实现方法

Java中的多线程有三种实现方式:
1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。
2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法。
3.实现Callable接口,重写call方法。Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。有以下三点
1).Callable可以在人物结束后提供一个返回值,Runnable没有提供这个功能。
2).Callable中的call方法可以抛出异常,而Runnable的run方法不能抛出异常。
3).运行Callable可以拿到一个Future对象,表示异步计算的结果,提供了检查计算是否完成的方法。
需要注意的是,无论用那种方式实现了多线程,调用start方法并不意味着立即执行多线程代码,而是使得线程变为可运行状态。
run start的区别
start方法是启动一个线程,而线程中的run方法来完成实际的操作。
如果开发人员直接调用run方法,那么就会将这个方法当作一个普通函数来调用,并没有多开辟线程,开发人员如果希望多线程异步执行,则需要调用start方法。
sleep wait的区别
1.两者处理的机制不同,sleep方法主要是,让线程暂停执行一段时间,时间一到自动恢复,并不会释放所占用的锁,当调用wait方法以后,他会释放所占用的对象锁,等待其他线程调用notify方法才会再次醒来。
2.sleep是Threa的静态方法,是用来控制线程自身流程的,而wait是object的方法,用于进行线程通信。
3.两者使用的区域不同。sleep可以在任何地方使用,wait必须放在同步控制方法,或者语句块中执行。
synchronized notify wait的运用
synchronized关键字有两种用法,synchronized方法和synchronized语句块。
public synchronized void function(){}
synchronized(object){}
当某个资源被synchronized所修饰,线程1线程2等多个线程在共同请求这个资源,线程1先请求到,调用了对象的wait方法释放了对象的锁,此时线程2可以对这个对象进行访问,在工作结束时可以调用对象的notify方法,唤醒等待队列中正在等待的线程,此时被唤醒的线程将会再一次拿到对象锁,对对象进行操作。可以调用notifyAll方法,唤醒等待队列中的所有线程。
需要注意的是一个线程被唤醒不代表立即获取对象锁,必须等调用的线程对象的方法推出synchronized块释放对象锁后,被唤醒的进程才会获得对象锁。
以下为大家提供一个简单的代码实例:
分别用Runnable和Thread方法实现,展示各个方法的
实现Runnable实现多线程的方法
public class TestRunnable implements Runnable {
private int time=1;
private SourceA s;
private String id = "001";
public TestRunnable(SourceA s){
this.s = s;
}
public void setTime(int time) {
this.time = time;
}
@Override
public void run() {
try {
System.out.println("i will sleep"+ time);
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(s){
s.notify();
System.out.println("我唤醒了002!");
System.out.println("我存入了id"+id);
s.setSource(id);
}
}
}
继承Thread实现多线程的方法
public class TestThread extends Thread {
private int time = 1;
private SourceA s = null;
String id = "002";
public void setTime(int time) {
this.time = time;
}
public TestThread(SourceA s){
this.s = s ;
}
@Override
public void run() {
try {
System.out.println("i will sleep"+ time);
sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(s){
try {
System.out.println("我"+ id +"要进行等待了");
s.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("我被唤醒了");
System.out.println("我存入了id"+id);
s.setSource(id);
}
}
}
SourceA类代码:
public class SourceA {
private List<String> list = new ArrayList<String>();
public synchronized void getSource(){
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
public synchronized void setSource(String id){
list.add(id);
}
}
Test测试类代码:
public void test(){
SourceA s = new SourceA();
TestThread tt = new TestThread(s);
TestRunnable tr = new TestRunnable(s);
Thread t = new Thread(tr);
System.out.println("调用线程1");
tt.start();
System.out.println("调用线程2");
t.start();
}
结果图片:
# Java多线程
# java通过共享变量结束run停止线程的方法示例
# Java实现在不同线程中运行的代码实例
# java多线程之定时器Timer的使用详解
# java 实现线程同步的方式有哪些
# Java多线程的用法详解
# 15个高级Java多线程面试题及回答
# java基本教程之java线程等待与java唤醒线程 java多线程教程
# Java线程中断的本质深入理解
# JAVA中 终止线程的方法介绍
# java多线程和并发包入门示例
# 图解Java线程的生命周期
# JAVA生产者消费者(线程同步)代码学习示例
# Java通过在主循环中判断Boolean来停止线程的方法示例
# 多线程
# 的是
# 才会
# 重写
# 提供一个
# 开发人员
# 抛出
# 需要注意
# 实现了
# 放在
# 多个
# 不代表
# 有多
# 他会
# 三点
# 一到
# 有两种
# 会再
# 会将
# 以对
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Android自定义listview布局实现上拉加载下拉刷新功能
如何快速打造个性化非模板自助建站?
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Laravel如何使用Blade模板引擎?(完整语法和示例)
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
如何快速搭建安全的FTP站点?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
PHP正则匹配日期和时间(时间戳转换)的实例代码
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
电商网站制作价格怎么算,网上拍卖流程以及规则?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
网站建设保证美观性,需要考虑的几点问题!
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何快速配置高效服务器建站软件?
Laravel如何使用Telescope进行调试?(安装和使用教程)
如何快速生成专业多端适配建站电话?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
昵图网官网入口 昵图网素材平台官方入口
使用豆包 AI 辅助进行简单网页 HTML 结构设计
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Linux系统命令中tree命令详解
高端网站建设与定制开发一站式解决方案 中企动力
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
如何确保西部建站助手FTP传输的安全性?
Windows Hello人脸识别突然无法使用
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何在景安服务器上快速搭建个人网站?
JavaScript如何实现路由_前端路由原理是什么
高防服务器租用如何选择配置与防御等级?
如何在Windows 2008云服务器安全搭建网站?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
,交易猫的商品怎么发布到网站上去?
JavaScript数据类型有哪些_如何准确判断一个变量的类型
再谈Python中的字符串与字符编码(推荐)
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Angular 表单中正确绑定输入值以确保提交与验证正常工作
在Oracle关闭情况下如何修改spfile的参数
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Laravel如何实现API速率限制?(Rate Limiting教程)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何快速搭建高效香港服务器网站?
EditPlus中的正则表达式实战(5)

