并发编程面试题一

ops/2025/3/16 1:41:07/

1、什么是进程、线程、协程,他们之间的关系是怎样的

进程是操作系统进行资源分配和调度的基本单位。每个进程都有独立的内存空间,进程之间相互独立,一个进程崩溃不会影响其他进程,进程间通信(IPC)需要通过特定的机制,如管道、消息队列、共享内存等。创建和销毁进程的开销较大,因为需要分配和回收独立的资源。

线程是进程中的一个执行单元,是CPU调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和资源。线程之间共享进程的资源,因此线程间的通信更加方便,但也容易引发资源竞争和同步问题。线程的创建和销毁开销较小,因为它们共享进程的资源。

协程是一种用户态的轻量级线程,由程序员在代码中显式控制调度。协程可以在执行过程中暂停和恢复,而不需要操作系统的介入。

一个程序运行之后,至少会有一个进程,一个进程可以包括多个线程,但至少有一个线程。

2、协程对于多线程的优缺点

优点:非常快速的上下文切换,单线程就可以实现高并发,由于只有一个线程,不存在同时写变量的冲突。

缺点:目前没有成熟的第三方库,存在风险。

3、并发和并行的区别并举例

并发是指多个任务在同一段时间内交替执行,从宏观上看是同时进行的,实际上是快速切换任务来实现的。

并行是多个任务真正同时进行,通常需要多核CPU或多台机器的支持。

举例:大厨跟三个徒弟甲、乙、丙的故事

单线程:大厨先跟甲说如何做可乐鸡翅,甲做完之后,大厨再跟乙说如何做可乐鸡翅,乙做完之后,大厨再跟丙说如何做可乐鸡翅,丙做完之后,线程结束。

并发:大厨先跟甲说如何做可乐鸡翅,甲在做可乐鸡翅的同时,大厨跟乙说如何做,不用等到甲做完。

并行:直接给三个徒弟发配三个大厨。

4、java里面实现多线程有哪几种方式,有什么不同

(1)继承Thread:重写里面run方法,创建实例,执行start。

优点:代码编写简单。

缺点:没有返回值,继承一个类之后没法继承其他的类,拓展性差。

public class ThreadDemo extends Thread{@Overridepublic void run() {System.out.println("继承Thread实现多线程,名称:"+Thread.currentThread().getName());}
}//Main方法
public class Main {public static void main(String[] args) {ThreadDemo t1 = new ThreadDemo();t1.setName("Demo1");t1.start();System.out.println("主线程名称:"+Thread.currentThread().getName());
}

运行结果: 

主线程名称:main
继承Thread实现多线程,名称:Demo1

(2)实现Runnable:定义一个类实现Runnable接口,实现里面的run方法,创建Thread类,将实现Runnable接口的类的对象作为参数传递给Thread对象,调用star方法。

优点:线程类可以实现多个接口,也可以再继承一个类。

缺点:没有返回值,不能直接启动,需要构造一个Thread实例传递进去启动。

public class RunnableDemo implements Runnable{@Overridepublic void run() {System.out.println("通过Runnable实现多线程,名称:"+Thread.currentThread().getName());}
}//Main方法
public class Main {public static void main(String[] args) {RunnableDemo r = new RunnableDemo();Thread t2 = new Thread(r);t2.setName("Demo2");t2.start();System.out.println("主线程名称:"+Thread.currentThread().getName());
}

运行结果: 

通过Runnable实现多线程,名称:Demo2
主线程名称:main

(3)通过Callable和FutureTask方式:定义一个类实现Callable接口,实现里面的call方法。创建FutureTask类的对象,将Callable对象作为参数传递给FutureTask对象。创建Thread类,将FutureTask对象作为参数传递给Thread对象,调用star方法。

优点:有返回值,拓展性也高。

缺点:JDK5以后才支持,需要重写call方法,结合多个类比如FutureTask和Thread类。

public class CallableDemo implements Callable {@Overridepublic Object call() throws Exception {System.out.println("通过Callable实现多线程,名称:"+Thread.currentThread().getName());return "这是返回值";}
}//Main方法
public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {CallableDemo c = new CallableDemo();FutureTask f = new FutureTask(c);Thread t3 = new Thread(f);t3.setName("Demo3");t3.start();System.out.println("主线程名称:"+Thread.currentThread().getName());System.out.println(f.get());
}

运行结果: 

主线程名称:main
通过Callable实现多线程,名称:Demo3
这是返回值

(4)通过线程池创建线程:定义一个类实现Runnable接口,实现里面的run方法,创建线程池,调用执行方法并传入实现Runnable接口的类的对象。

优点:安全高性能,复用线程。

缺点:JDK5之后才支持,需要结合Runnable进行使用。

public class RunnableDemo1 implements Runnable {@Overridepublic void run() {System.out.println("通过创建线程池来实现多线程,名称:"+Thread.currentThread().getName());}
}//Main方法
public class Main {public static void main(String[] args){RunnableDemo1 r1 = new RunnableDemo1();ExecutorService e = Executors.newFixedThreadPool(3);for(int i=0;i<10;i++){e.execute(r1);}//关闭线程池e.shutdown();}
}

运行结果: 

通过创建线程池来实现多线程,名称:pool-1-thread-1
通过创建线程池来实现多线程,名称:pool-1-thread-3
通过创建线程池来实现多线程,名称:pool-1-thread-2
通过创建线程池来实现多线程,名称:pool-1-thread-3
通过创建线程池来实现多线程,名称:pool-1-thread-2
通过创建线程池来实现多线程,名称:pool-1-thread-1
通过创建线程池来实现多线程,名称:pool-1-thread-2
通过创建线程池来实现多线程,名称:pool-1-thread-1
通过创建线程池来实现多线程,名称:pool-1-thread-1
通过创建线程池来实现多线程,名称:pool-1-thread-2

我们一般常用Runnable和线程池两种方式,简单方便,高性能。 


http://www.ppmy.cn/ops/166085.html

相关文章

裂变营销策略在“开源链动2+1模式AI智能名片S2B2C商城小程序”中的应用探索

摘要&#xff1a;在当今数字化时代&#xff0c;企业营销手段日新月异&#xff0c;裂变营销作为一种高效的用户增长策略&#xff0c;正逐渐成为众多企业竞相探索的焦点。本文旨在探讨“开源链动21模式AI智能名片S2B2C商城小程序”中裂变营销的应用&#xff0c;通过“分名、分利、…

【初级篇】如何使用DeepSeek和Dify构建高效的企业级智能客服系统

在当今数字化时代,企业面临着日益增长的客户服务需求。使用Dify创建智能客服不仅能够提升客户体验,还能显著提高企业的运营效率。关于DIfy的安装部署,大家可以参考之前的文章: 【入门级篇】Dify安装+DeepSeek模型配置保姆级教程_mindie dify deepseek-CSDN博客 AI智能客服…

Spring Boot 常用注解的分类及简明解释

以下是 Spring Boot 常用注解的分类及简明解释&#xff0c;帮助快速理解和使用&#xff1a; 一、核心注解 SpringBootApplication 作用&#xff1a;主类注解&#xff0c;标记 Spring Boot 应用的入口。组合功能&#xff1a; SpringBootConfiguration&#xff1a;标识配置类。En…

黑马JUC学习笔记-上

1.进程与线程 1.进程与线程的概念 2.并行和并发 并发 操作系统的任务调度器可以在同一时间应对多件事情 时间片轮转 每个线程都有一个时间片 在一个时间片内如果线程未执行完毕会被暂停 然后将下一条将要执行的指令存在程序计数器上&#xff08;类似于存档&#xff09;然后…

python+flask实现360全景图和stl等多种格式模型浏览

1. 安装依赖 pip install flask 2. 创建Flask应用 创建一个基本的Flask应用&#xff0c;并设置路由来处理不同的文件类型。 from flask import Flask, render_template, send_from_directory app Flask(__name__) # 设置静态文件路径 app.static_folder static app.r…

深搜专题9:取数游戏

输入描述 第一行有一个正整数 T&#xff0c;表示了有 T 组数据。 对于每一组数据&#xff0c;第一行有两个正整数 N 和 M&#xff0c;表示了数字矩阵为 N 行 M 列。 接下来 N 行&#xff0c;每行 M 个非负整数&#xff0c;描述了这个数字矩阵。 对于20%的数据&#xff0c;1…

JVM调优关注的核心指标?

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

新疆美女演员吾热叶提正式加入创星演员出道计划,开启演艺事业新篇章

2月25日&#xff0c;演员吾热叶提正式加入“创星演员出道计划”&#xff0c;不仅得到参演都市爱情喜剧《和我结婚吧》角色的机会&#xff0c;还获得网剧《一念逍遥》的出演机会&#xff0c;自此开启全新影视之路。作为拥有无限潜力的演员&#xff0c;相信吾热叶提能凭借自身实力…