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)