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

Java面试黄金宝典40

1. 进程线程区别

 

  • 定义
    1. 进程是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程都有独立的地址空间、内存、数据栈等资源。
    2. 线程是进程中的一个执行单元,是 CPU 调度和分派的基本单位。线程共享所属进程的资源,如地址空间、打开的文件等,但有自己独立的栈空间和程序计数器。
  • 要点
    1. 资源分配:进程有独立资源,线程共享进程资源。
    2. 调度:进程调度开销大,线程调度开销小。
    3. 并发性:进程之间相互独立,线程之间可以并发执行,且同一进程内的线程切换效率更高。
  • 应用:在 Java 中,多线程编程常用于提高程序的并发性能,例如 Web 服务器中,每个请求可以分配到一个线程来处理,以提高服务器的响应能力。而进程间通信相对复杂,常用于不同应用程序之间的交互。
  • 代码示例:以下是一个简单的 Java 多线程示例,创建两个线程并启动,它们共享同一个 Runnable 对象的资源。

java

public class ThreadExample {
    public static void main(String[] args) {
        Runnable runnable = new MyRunnable();
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
        thread1.start();
        thread2.start();
    }
}

class MyRunnable implements Runnable {
    private int count = 0;

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            count++;
            System.out.println(Thread.currentThread().getName() + " count: " + count);
        }
    }
}

 

2. 进程通信方式

 

  • 定义:进程通信是指在不同进程之间进行数据交换和信息传递的机制。
  • 要点
    1. 管道:具有亲缘关系的进程间通信方式,半双工,数据只能单向流动。
    2. 消息队列:进程间通过发送和接收消息来进行通信,消息具有类型,可按类型接收。
    3. 共享内存:多个进程共享同一块内存区域,实现数据的快速交换,但需要同步机制来保证数据的一致性。
    4. 信号量:用于控制多个进程对共享资源的访问,通过 P、V 操作实现进程的同步和互斥。
    5. 套接字:可用于不同主机间的进程通信,是网络编程中常用的通信方式。
  • 应用:在分布式系统中,进程通信方式常用于不同节点之间的信息交互。例如,通过套接字实现服务器与客户端之间的通信;在并发程序中,使用信号量来控制多个进程对共享资源的访问。
  • 代码示例:以下是一个使用 Java 套接字进行进程通信的简单示例,实现了一个服务器端和一个客户端的通信。

java

// 服务器端
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            Socket socket = serverSocket.accept();
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.println("Hello from server!");
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8888);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = in.readLine();
            System.out.println("Received from server: " + message);
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

3. 僵尸进程

 

  • 定义:当子进程完成任务终止运行后,父进程没有及时调用waitwaitpid系统调用获取子进程的终止状态信息,子进程就会变成僵尸进程。僵尸进程虽然已经停止运行,但仍会在系统中保留一些资源,如进程控制块(PCB)。
  • 要点
    1. 产生原因:父进程未回收子进程资源。
    2. 危害:占用系统资源,如果大量产生,可能会耗尽系统的进程资源,影响系统性能。
  • 应用:在实际开发中,需要注意避免产生僵尸进程,特别是在多进程编程中,要确保父进程及时回收子进程的资源。
  • 代码示例:以下是一个可能产生僵尸进程的 Java 代码示例(通过调用系统命令创建子进程),在实际中可以通过Process.waitFor方法来等待子进程结束并回收资源
http://www.dtcms.com/a/118497.html

相关文章:

  • 小甲鱼python【p3】
  • Vue.js 实现下载模板和导入模板、数据比对功能核心实现。
  • Scala-面向对象2和集合
  • 解决 Kubernetes 中容器 `CrashLoopBackOff` 问题的实战经验
  • SpringBoot底层-数据源自动配置类
  • 版本控制工具——SVN
  • Linux之Shell脚本--命令提示的写法
  • Axure PR 9 中继器 08 添加行
  • JSON格式
  • Linux的那些基础常用命令汇总
  • 基于SSM的旅游推荐系统网站
  • 聊聊Spring AI的MilvusVectorStore
  • 前端网络请求与资源加载优化实战指南
  • 【AI提示词】因果溯源大师
  • SpringBoot学生成绩管理系统设计与实现
  • [Linux][经验总结]vi编辑文件中文乱码,但cat查看却显示正常处理方法
  • 国网B接口注册流程详解以及注册失败原因(电网B接口)
  • 明远智睿RK3588开发板助力工业机器智能化升级
  • 通过世界排名第一的免费开源ERP,构建富有弹性的智能供应链
  • 高级:消息队列面试题精讲
  • 【学Rust写CAD】36 颜色插值函数(alpha256.rs补充方法)
  • Vue3实战二、搭建Vue3+ElementPlus项目教程
  • Scala 转义字符
  • AI赋能ArcGIS Pro——水系网络AI智能提取 | GIS人工智能制图技术解析
  • 洛谷 P3367 【模板】并查集 C++
  • [原创](Modern C++)现代C++的关键性概念: std::move()可以理解为把数据进行剪切再粘贴.
  • BGP路由协议之解决 IBGP 水平分割带来的问题
  • 【Tauri2】016——后端Invoke结构体和invoke_key
  • opus+ffmpeg+c++实现录音
  • Windwos的DNS解析命令nslookup