java中的进程的详细解析
JavaEE 初阶进程一、操作系统操作系统是计算机中的一个重要软件。操作系统是一个搞管理的软件管理各种硬件设备给各种应用程序提供一个稳定的运行环境这些应用程序在运行中即使有一个应用程序发生bug崩溃了也不会影响其他应用程序的执行。操作系统中的重要概念进程• 运行起来的程序就叫进程。站在操作系统的视角如何管理进程先描述使用结构体描述出进程的核心属性进程控制块PCB非常大的结构体有很多个属性。再把多个进程组织起来比如Linux这样的操作系统使用链表这样的方式把每个PCB串一起。•操作系统本身也是一个软件也是由一系列指令构成的在启动时CPU依次执行操作系统上的这些指令引导操作系统起来• 所有的软件本质上都是靠CPU来执行的CPU具体执行哪些指令一定程度上受操作系统的影响。文件描述符进程在运行过程中很多时候需要和硬盘这个硬件设备进行交互。硬盘上的数据就是以文件的形式来组织的。进程在读写文件的时候就需要打开文件每个打开的文件相关的信息保存到文件描述符中文件的每一项都对应着打开了的一份文件。操作系统中会把很多资源抽象成文件来表示所以“文件”不只是硬盘上的类例网卡操作系统管理网卡的时候就是当作“文件”一样来管理二、进程的运行•进程的运行也会依赖到硬盘、网卡等相关硬件设备•进程运行执行指令都是靠CPU的。进程是操作系统中负责分配CPU的基本单位。分时复用把一个单位时间分成很多份分别执行不同进程的指令第一份执行进程1指令第二份执行进程2的指令……因为CPU的运行速度是特别快所以在切换的过程中人眼很难察觉出变化了像同时执行一样。把一个CPU核心上按照分时复用执行多个进程就叫“并发执行”多个进程在一个CPU核心上在不同单位时间内执行。把多个CPU核心上同时执行多个进程称为“并行执行”多个进程在多个CPU核心上同时执行进程状态New(新建)RUNNABLE(可运行)BLOCKED(阻塞)WAITING(等待)TIMED_WAITING(超时等待)TERMINATED(终止)进程有多种状态下面是两个典型1就绪状态 → 随时可以到CPU上执行2阻塞状态 → 进程当前不适合到CPU上执行进程有优先级为了保证需要大量CPU资源能的正常执行进程的上下文因为有进程调度一个进程执行一会就会让出CPU这期间CPU执行它会保存上次执行的状态多进程继续执行进程在CPU中运行的过程中CPU上的各种寄存器就保存了当前进程运行的“中间状态”寄存器上关于进程的信息存放在内存中PCB自己也会有对应空间恢复时把PCB中刚才保存的属性填回CPU的寄存器。进程的记账信息统计功能统计每个进程在CPU上运行了多久如果发现某个进程 很久没有吃到CPU资源就会给它资源倾斜一点之后防止这个进程饿死new(新建)runnable(可运行)、blocked(阻塞)、waiting(等待)timed_waiting(超时等待) terminated(终止)三、多线程进程整体是一个比较“重”的概念创建进程/销毁进程开销比较大为了解决上述问题引入线程轻量级进程创建销毁开销小每个进程都相当于一个要执行的任务每个线程也是一个要执行的任务进程包含线程每个进程中都会包含一个或多个线程进程是操作系统资源分配的基本单位进程内部所包含的多个线程之间会共享上述的内存资源和硬盘资源网络带宽。进程创建需要申请资源进程的销毁需要释放资源→ 重量级事物代价大时间消耗对于线程来说只是第一个线程创建的时候和进程一起创建申请资源后续再创建线程不再手动到资源申请操作内核少快只有所有的线程都销毁进程销毁才会释放资源单个进程销毁某个线程也不会释放资源。可以理解为在进程创建的时候给线程创建了一次资源后续线程的创建和销毁都在这一层只有进程被销毁这一次资源才会被回收。关于线程的调度是随机的我们的程序是感知不到也干预不了。那怎么提高效率引入多个线程 确实可以提升效率 但是资源一旦 就那么多引入过多线程会使上下文切换开销增长因为调度开销会拖累程序的性能。而且其中一个线程抛出异常会带走整个进程所有的线程都无法运行。如果及时捕获也不一定 终导致进程终止。创建第一个线程classMyThreadextendsThread{Overridepublicvoidrun(){System.out.println(hello);try{Thread.sleep(1000);}catch(InterruptedExceptione){// throw new RuntimeException(e); // 处理异常的手段抛出异常导致程序异常终止break;}}}publicclassTest{publicstaticvoidmain(String[]args){ThreadtnewMyThread();t.start();// 开启线程}}其中 Thread.sleep(); 会休眠例Thread.sleep(0);这里是 让此线程放弃当前CPU资源给别的线程用在run()方法内Thread.sleep()会抛出异常但无法throws只能使用try{} catch{}来捕获。每个线程调度顺序是随机的无法预测。“抢占式执行”创建线程的方法继承 Thread重写 run实现 Runnable 接口重写 run例Runnable runnable new MyRunnable();Thread t new Thread(runnable);classMyRunnableimplementsRunnable{Overridepublicvoidrun(){System.out.println(我自己的 Runnable 的 run 方法);}}publicclassDeano01{publicstaticvoidmain(String[]args){Runnabler1newMyRunnable();Threadt1newThread(newMyRunnable());Threadt2newThread(r1);t1.start();t2.start();}}classMyThreadextendsThread{Overridepublicvoidrun(){System.out.println(我自己的 Thread 的 run 方法);}}publicclassDeano01{publicstaticvoidmain(String[]args){// 1. 自己实现一个自己的Threa类ThreadtnewMyThread();t.start();// 2. 使用 lamabda 表达式Threadt1newThead(()-{System.out.println(我自己的 Thread 的 run 方法);});}}这个接口中只有一个无参返回值的 run 方法可以使用 lambda 表达式 () - { 要执行的代码 }在括号里没有参数!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2631018.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!