首页 > 其他分享 >多线程面试-基础篇(多线程系列连更,后续可查看合集)

多线程面试-基础篇(多线程系列连更,后续可查看合集)

时间:2024-03-15 17:58:46浏览次数:34  
标签:balance 获取 方法 接口 Callable 面试 线程 多线程 合集

问:线程和进程的区别?

答:根本区别:进程是系统划分资源的最小单位,线程是cpu执行和调度的最基本单位。进程包含线程,进程内可包含多个线程。

问:为什么要使用多线程?

答:提高cpu利用率,并且线程切换和调度成本远小于进程。

问:什么是线程死锁?如何避免线程死锁?

线程死锁是指,在多线程情况下,A线程持有锁需要B线程所占有的资源,B线程持有锁需要A线程占有的资源,两个互相掣肘,导致线程死锁。

解决办法:1、尽可能的让某个线程在申请资源时,一次性的占有所需要的全部资源。

2、锁排序:指定锁的获取顺序,规定只有获取到A锁的线程才有资格获取B锁,同时获取到两个锁的线程才能对资源进行操作。

        具体代码如何实现呢?答:可以采取嵌套锁,先获取A锁,再获取B锁

 public synchronized void transferTo(BankAccount target, int amount) {
        // 获取转出账户的锁
        synchronized (this) {
            // 获取转入账户的锁
            synchronized (target) {
                if (balance >= amount) {
                    this.balance -= amount;
                    target.balance += amount;
                    System.out.println("转账成功,转出账户余额:" + this.balance + ",转入账户余额:" + target.balance);
                } else {
                    System.out.println("转账失败,转出账户余额不足");
                }
            }
        }
    }

问:代码中如何创建线程?

答:三种方式:

  • 继承Thead类重写run方法,调用start方法,开启线程。调用start方法底层会调用start0方法开启线程。
  • 实现Runnable接口,重写run方法,创建Thread类传入实现类,调用start方法开启线程。
  • 实现Callable接口,重写call方法,创建一个 ExecutorService 对象,调用 ExecutorServicesubmit() 方法,将 Callable 对象传递给它。这将返回一个 Future 对象,您可以使用它来获取 Callable 的执行结果。
// 创建一个固定大小的线程池
ExecutorService executor = Executors.newFixedThreadPool(1);

// 创建 Callable 对象的实例
Callable<Integer> callable = new MyCallable();

// 提交 Callable 对象给线程池执行
Future<Integer> future = executor.submit(callable);

问:Thread类、Runnable接口创建线程、Callable接口创建线程有什么区别?

Thread类只能继承,继承后不能再继承其他类,其他两个接口可以实现多个;Runnable接口不会返回结果和抛出异常,但Callable接口会返回执行结果和抛出异常。

问:wait方法和sleep方法的区别?

答:sleep方法不会释放锁,wait方法会释放锁,sleep方法只是让当前线程休眠,如果当前线程持有锁,不会释放锁,当休眠结束后线程自动苏醒,仍旧会执行当前线程。

wait方法也是让当前线程阻塞,但不一样的是,wait方法不会去自动苏醒,并且它会释放当前线程持有的锁,只有当另外一个线程调用休眠线程的notify方法才会苏醒。这也就完成了线程之间的通信。

标签:balance,获取,方法,接口,Callable,面试,线程,多线程,合集
From: https://blog.csdn.net/m0_53327171/article/details/136740039

相关文章

  • 面试相关问题准备
    一.MySql篇1优化相关问题1.1MySql中如何定位慢查询?慢查询的概念:在MySQL中,慢查询是指执行时间超过一定阈值的SQL语句。这个阈值是由long_query_time参数设定的,它的默认值是10秒1。也就是说,如果一条SQL语句的执行时间超过了long_query_time所设定的时间,那么这条SQL语句就被......
  • 2024前端 JS面试题
    目录1,JS数据类型2,JS两种数据类型1,基本数据类型1,基本数据类型的值不可变2,基本数据类型不可以添加属性和方法:3,基本数据类型的赋值是简单的赋值4,基本数据类型的比较是值的比较:5,基本数据类型的值存放在栈内存中6,基本数据类型详解1,undefined2,Null3,string4,Number5,Bo......
  • MIT 6.S081入门lab7 多线程
    MIT6.S081入门lab7多线程一、参考资料阅读与总结1.xv6book书籍阅读(Chapter7:SchedulingthroughSection7.4)1.概述:由于操作系统往往运行比CPU数量更多的进程,因此需要对CPU进行虚拟化,使多个进程能够分时复用CPU资源2.多路复用:xv6中多路复用有2种方式:sleep和wakeup机制......
  • 考研模拟面试-题目【攻略】
    考研模拟面试-题目【攻略】前言版权推荐考研模拟面试-题目前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全手写题数据结构操作系统计算机网络代码题基础代码题其他代码题后面的问题补充题目最后前言2023-10-1912:00:57以下内容源自《考研模......
  • 安卓Java面试题 171- 180
    171.简述实现Service不被杀死常驻内存的方式有哪些?(1):如果是安卓自身机制因为系统资源不足的时候杀死你的Service,那么一般情况下会在一段时间之后系统会重启刚刚被杀死的Service那么此时你该做的事就是怎么恢复Service被杀之前app的一些状态了,那么该怎么恢复呢?这里用......
  • JVM工作原理与实战(四十三):JVM常见面试题目
    专栏导航JVM工作原理与实战RabbitMQ入门指南从零开始了解大数据目录专栏导航前言一、JVM常见面试题目1.什么是类加载器,有哪些常见的类加载器?2.什么是双亲委派机制,以及如何打破双亲委派机制?3.如何判断堆上的对象没有被引用?4.JVM中都有哪些引用类型?5.ThreadLoca......
  • 多线程系列(二十) -CompletableFuture使用详解
    一、摘要在上篇文章中,我们介绍了Future相关的用法,使用它可以获取异步任务执行的返回值。我们再次回顾一下Future相关的用法。publicclassFutureTest{publicstaticvoidmain(String[]args)throwsException{longstartTime=System.currentTimeMillis()......
  • 【专题】2024年母婴营养品行业趋势白皮书报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35371原文出处:拓端数据部落公众号2023年,母婴营养品市场消费意识和需求持续增长,品类与品牌创新步伐加快,市场教育逐渐深化。在多重因素推动下,母婴营养品正步入发展新阶段,有望成为继奶粉之后的母婴市场新领军品类。阅读原文,获取专题报告合集全文,解锁......
  • C语言初学习——易错点合集(持续更新中)
    转义字符例题一intmain(){chars[]="012xy\08s34f4w2";inti,n=0;for(i=0;s[i]!=0;i++){if(s[i]>='0'&&s[i]<='9'){n++;}}printf(&quo......
  • 3月14日第一次面试记录(安全实习生)
    3月14日第一次面试记录(安全实习生)线上面试首先调试设备,保证通话质量。经历和经验自我介绍(没有提前准备,回答的很蒙)谈一谈你在护网中做了些什么?永恒之蓝漏洞原理,怎样防御log4g漏洞怎么修复linux对linux了解吗?查看内存操作是什么?怎样部署一个jdk?平时用linu......