java 多进程

Wesley13
• 阅读 927

多进程的概念

  • 一个JVM进程对应一个JAVA程序
  • Java编写程序都运行在在Java虚拟机(JVM)中,
    • 在JVM的内部,程序的多任务是通过线程来实现的
    • 每用java命令启动一个java应用程序,就会启动一个JVM进程。
    • 在同一个JVM进程中,有且只有一个进程,就是它自己。
    • 在这个JVM环境中,所有程序代码的运行都是以线程来运行。

多进程的创建

法一:

  • Runtime rt = Runtime.getRuntime();  
  • Process process = rt.exec("java com.test.process.MyClass");

 

法二:

  • ProcessBuilder pb = new ProcessBuilder(myXXcommand,myXXobject);  
  • Process p = pb.start();

创建ProcessBuilder对象是所使用的字符串command的含义:

  • command指令其实就是指在当前操作系统中如何启动一个应用的指令;

    • 比如下面的指令:
      •   String myQQcommand = "E:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe"; //启动windows下面的qq程序
          String myNotePadcommand = "E:\\Program Files\\Notepad++\\notepad++.exe"; //启动windows下的notepad程序
          String myNotePadobject= "C:\\Users\\evan\\Desktop\\files.txt";//notepad程序用于打开的应用
          String myJavacommand = "java";//运行java指令
          String myJavaobject = "com.test.process.MyClass";//指定Java运行的类对象
        
  • 环境:是从变量到值的依赖于系统的映射。

  • 工作目录:默认值是当前进程的当前工作目录,通常根据系统属性 user.dir 来命名。

  • redirectErrorStream 属性:最初,此属性为 false,意思是子进程的标准输出和错误输出被发送给两个独立的流,这些流可以通过 Process.getInputStream() 和 Process.getErrorStream() 方法来访问。

多进程间的通信

进程间通信的方法有:

  • 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
    • 进程的亲缘关系通常是指父子进程关系。
    • 备注:
      • 1、子进程的输出内容是无法在控制台输出的,只能再父类中获取并输出。 
        2、父进程往子进程写内容时如果关闭字节流,则子进程的输入流同时关闭。 
        3、如果父进程中输入、输出流都不关闭,子进程获取的字节流在达到8129byte时才返回。 
        4、关闭子进程一定要在父进程中关闭 p.destroy()
  • 套接字( socket ) : 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
  • 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,
    • 这段共享内存由一个进程创建,但多个进程都可以访问。
    • 共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。
    • 它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  • 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。
    • 它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
    • 因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。
    • 消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Stella981 Stella981
2年前
JVM调优之jstack找出最耗cpu的线程并定位代码
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。第一步先找出Java进程ID,服务器上的Java应用名称为mrfcenter:root@u
Wesley13 Wesley13
2年前
Java中User Thread和Daemon Thread的区别
Java将线程分为User线程和Daemon线程两种。通常Daemon线程用来为User线程提供某些服务。程序的main()方法线程是一个User进程。User进程创建的进程为User进程。当所有的User线程结束后,JVM才会结束。通过在一个线程对象上调用setDaemon(true),可以将user线程创建的线程明确地设置成Daemon线程。例如,时
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
JAVA多线程的学习笔记
第一次在开源中国上发博文,简单的把以前在达内培训JAVA时的一篇日志复制共享一下。多进程(多任务)-针对OS多线程(Thread)-一个进程内部的多任务java语言(JVM)支持多线程编程java.lang.ThreadThread类由JDK提供,用于封装对JVM中线程的控制,调用C语言的类库实现。1、创
Wesley13 Wesley13
2年前
Java多线程系列(1)
本章主要内容有:1.线程进程的区别2.线程的生命周期3.Java内存模型原子性,可见性及有序性4.线程池及Java实现1.线程进程的区别线程:程序运行的最小单位进程:资源分配的最小单位一个进程可以有多个线程,多个线程共享进程里面的数据线程间通讯相对更加方便,进程间通讯需要通过IPC(
Wesley13 Wesley13
2年前
Java面试官都爱问的多线程和并发面试题汇总,多刷一题,多份安心!
Java多线程面试问题1、进程和线程之间有什么不同?一个进程是一个独立(selfcontained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进
Wesley13 Wesley13
2年前
Java线程与多线程
1线程与多线程1.1线程是什么?线程(Thread)是一个对象(Object)。用来干什么?Java线程(也称JVM线程)是Java进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。Java程序采用多线程方式来支持大量的并发请求处理,程序如果在
京东云开发者 京东云开发者
5个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了