当前位置: 首页 > news >正文

多线程面试常问

一、创建线程的几种方式

1、继承Thread类并重写run()方法。

public class MyThread extends Thread {@Overridepublic void run() {System.out.println("通过集成 Thread 类实现线程");
}
}
// 如何使用
new MyThread().start()

2、实现Runnable接口并重写run()方法。将Runnable实例作为Thread类的构造函数参数传递并启动线程。

public class MyRunnable implements Runnable {
@Override
public void run() {System.out.println("通过实现 Runnable 方式实现线程");
}
}
// 使用
// 1、创建MyRunnable实例
MyRunnable runnable = new MyRunnable();
//2.创建Thread对象
//3.将MyRunnable放入Thread实例中
Thread thread = new Thread(runnable);
//4.通过线程对象操作线程(运行、停止)
thread.start();


3、实现Callable接口并重写call()方法。使用ExecutorService的submit()方法提交Callable任务,并通过Future对象获取返回值。

public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {return new Random().nextInt();}
// 使用方法
// 1、创建线程池
ExecutorService service = Executors.newFixedThreadPool(10);
// 2、提交任务,并用 Future提交返回结果
Future<Integer> future = service.submit(new MyCallable());
}

4.使用线程池。线程池可以重复使用线程,提高性能和可靠性。Java提供了Executor框架来管理线程池。常见的线程池实现类包括ThreadPoolExecutor和ScheduledThreadPoolExecutor

public class ThreadPool {public static void main(String[] args) {//1. 提供指定线程数量的线程池ExecutorService service = Executors.newFixedThreadPool(1);//输出class java.util.concurrent.ThreadPoolExecutorSystem.out.println(service.getClass());ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;//自定义线程池的属性//        service1.setCorePoolSize(15);//        service1.setKeepAliveTime();//2. 执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象service.execute(new NumberThread());//适用于Runnableservice.execute(new NumberThread1());//适用于Runnable//        service.submit(Callable callable);//适合使用于Callable//3. 关闭连接池service.shutdown();}}

 

二、线程的几种状态

 

 

二、如何保证线程执行顺序

使用join,可以等待线程执行完成

三、notify和notifyAll的区别

notify只是随机唤醒一个线程

notifyAll是唤醒所有的线程

四、java中wait和sleep方法的不同

五、锁升级过程

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MarkDown演示
  • 【PostgreSQL教程】PostgreSQL 高级篇之触发器
  • 以简单的例子从头开始建spring boot web多模块项目(四)-多模块工具类
  • Android TableLayout中TextView文本不居中问题
  • 大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
  • FastAPI vs Flask: 专业对比与选择
  • 使用 setResponseStatus 函数设置响应状态码
  • Prometheus Operator部署管理
  • SQL每日一题-0823(难度提升题)
  • SpringCloud Gateway及 Springboot 服务 跨域配置
  • gcc: leaf function/non-leaf function;末节函数,叶子函数
  • conda虚拟环境中安装cuda和cudnn
  • Milvus向量数据库-磁盘索引简介
  • HTTP 414错误问题
  • 第三课《排序》
  • 时间复杂度分析经典问题——最大子序列和
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 10个确保微服务与容器安全的最佳实践
  • classpath对获取配置文件的影响
  • ECMAScript6(0):ES6简明参考手册
  • ES学习笔记(12)--Symbol
  • JavaScript服务器推送技术之 WebSocket
  • k8s 面向应用开发者的基础命令
  • Laravel Telescope:优雅的应用调试工具
  • MQ框架的比较
  • quasar-framework cnodejs社区
  • vue-cli在webpack的配置文件探究
  • windows下使用nginx调试简介
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 批量截取pdf文件
  • 如何合理的规划jvm性能调优
  • 微服务核心架构梳理
  • 微信小程序实战练习(仿五洲到家微信版)
  • 新书推荐|Windows黑客编程技术详解
  • 一道面试题引发的“血案”
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 我们雇佣了一只大猴子...
  • #Java第九次作业--输入输出流和文件操作
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (SERIES12)DM性能优化
  • (动态规划)5. 最长回文子串 java解决
  • (二十三)Flask之高频面试点
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (一)appium-desktop定位元素原理
  • (已解决)什么是vue导航守卫
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转载)(官方)UE4--图像编程----着色器开发
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数