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

商城网站设计企业百度官方版下载

商城网站设计企业,百度官方版下载,专门做图片的网站,seo承诺排名的公司Java创建进程1 进程的概念 11.1 进程的概念 11.2 进程的特征 11.3 进程与线程区别 12 进程的创建 12.1 JAVA进程的创建 12.1.1 ProcessBuilder 22.1.2 Runtime 32.1.3 Process 42.2 实例 52.2.1 创建子进程 52.2.2 进程阻塞问题 72.2.3 在java中执行java程序 111 进程的概念1.1…Java创建进程1 进程的概念 11.1 进程的概念 11.2 进程的特征 11.3 进程与线程区别 12 进程的创建 12.1 JAVA进程的创建 12.1.1 ProcessBuilder 22.1.2 Runtime 32.1.3 Process 42.2 实例 52.2.1 创建子进程 52.2.2 进程阻塞问题 72.2.3 在java中执行java程序 111 进程的概念1.1 进程的概念进程是操作系统结构的基础是一个正在执行的程序计算机中正在运行的程序实例可以分配给处理器并由处理器执行的一个实体由单一顺序的执行显示一个当前状态和一组相关的系统资源所描述的活动单元。第一进程是一个实体。每一个进程都有它自己的地址空间一般情况下包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码数据区域存储变量和进程执行期间使用的动态分配的内存堆栈区域存储着活动过程调用的指令和本地变量。第 二进程是一个“执行中的程序”。程序是一个没有生命的实体只有处理器赋予程序生命时它才能成为一个活动的实体我们称其为进程。1.2 进程的特征动态性进程的实质是程序在多道程序系统中的一次执行过程进程是动态产生动态消亡的。并发性任何进程都可以同其他进程一起并发执行独立性进程是一个能独立运行的基本单位同时也是系统分配资源和调度的独立单位异步性由于进程间的相互制约使进程具有执行的间断性即进程按各自独立的、不可预知的速度向前推进结构特征进程由程序、数据和进程控制块三部分组成。多个不同的进程可以包含相同的程序一个程序在不同的数据集里就构成不同的进程能得到不同的结果但是执行过程中程序不能发生改变。1.3 进程与线程区别进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间一个进程崩溃后在保护模式下不会对其它进程产生影 响而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量但线程之间没有单独的地址空间一个线程死掉就等于整个进程死掉所以多进程的程 序要比多线程的程序健壮但在进程切换时耗费资源较大效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作只能用线程不能用进程。2 进程的创建2.1 Java进程的创建Java提供了两种方法用来启动进程或其它程序(1)使用Runtime的exec()方法(2)使用ProcessBuilder的start()方法2.1.1 ProcessBuilderProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类此类用于创建操作系统进程它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前都是由Process类处来实现进程的控制管理。每个 ProcessBuilder 实例管理一个进程属性集。start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用以利用相同的或相关的属性创建新的子进程。每个进程生成器管理这些进程属性命令 是一个字符串列表它表示要调用的外部程序文件及其参数(如果有)。在此表示有效的操作系统命令的字符串列表是依赖于系统的。例如每一个总体变量通常都要成为此列表中的元素但有一些操作系统希望程序能自己标记命令行字符串——在这种系统中Java 实现可能需要命令确切地包含这两个元素。环境 是从变量 到值 的依赖于系统的映射。初始值是当前进程环境的一个副本(请参阅 System.getenv())。工作目录。默认值是当前进程的当前工作目录通常根据系统属性 user.dir 来命名。redirectErrorStream 属性。最初此属性为 false意思是子进程的标准输出和错误输出被发送给两个独立的流这些流可以通过 Process.getInputStream() 和 Process.getErrorStream() 方法来访问。如果将值设置为 true标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。在此情况下合并的数据可从Process.getInputStream() 返回的流读取而从 Process.getErrorStream() 返回的流读取将直接到达文件尾。修改进程构建器的属性将影响后续由该对象的 start() 方法启动的进程但从不会影响以前启动的进程或 Java 自身的进程。大多数错误检查由 start() 方法执行。可以修改对象的状态但这样 start() 将会失败。例如将命令属性设置为一个空列表将不会抛出异常除非包含了 start()。注意此类不是同步的。如果多个线程同时访问一个 ProcessBuilder而其中至少一个线程从结构上修改了其中一个属性它必须 保持外部同步。Java代码  构造方法摘要ProcessBuilder(List command)利用指定的操作系统程序和参数构造一个进程生成器。ProcessBuilder(String... command)利用指定的操作系统程序和参数构造一个进程生成器。方法摘要List command()返回此进程生成器的操作系统程序和参数。ProcessBuilder command(List command)设置此进程生成器的操作系统程序和参数。ProcessBuilder command(String... command)设置此进程生成器的操作系统程序和参数。File directory()返回此进程生成器的工作目录。ProcessBuilder directory(File directory)设置此进程生成器的工作目录。Map environment()返回此进程生成器环境的字符串映射视图。boolean redirectErrorStream()通知进程生成器是否合并标准错误和标准输出。ProcessBuilder redirectErrorStream(boolean redirectErrorStream)设置此进程生成器的 redirectErrorStream 属性。Process start()使用此进程生成器的属性启动一个新进程。2.1.2 Runtime每个 Java 应用程序都有一个 Runtime 类实例使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。应用程序不能创建自己的 Runtime 类实例。但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。一旦得到了一个当前的Runtime对象的引用就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。Java代码  void addShutdownHook(Thread hook)注册新的虚拟机来关闭挂钩。int availableProcessors()向 Java 虚拟机返回可用处理器的数目。Process exec(String command)在单独的进程中执行指定的字符串命令。Process exec(String[] cmdarray)在单独的进程中执行指定命令和变量。Process exec(String[] cmdarray, String[] envp)在指定环境的独立进程中执行指定命令和变量。Process exec(String[] cmdarray, String[] envp, File dir)在指定环境和工作目录的独立进程中执行指定的命令和变量。Process exec(String command, String[] envp)在指定环境的单独进程中执行指定的字符串命令。Process exec(String command, String[] envp, File dir)在有指定环境和工作目录的独立进程中执行指定的字符串命令。void exit(int status)通过启动虚拟机的关闭序列终止当前正在运行的 Java 虚拟机。long freeMemory()返回 Java 虚拟机中的空闲内存量。void gc()运行垃圾回收器。InputStream getLocalizedInputStream(InputStream in)已过时。 从 JDK 1.1 开始将本地编码字节流转换为 Unicode 字符流的首选方法是使用 InputStreamReader 和 BufferedReader 类。OutputStream getLocalizedOutputStream(OutputStream out)已过时。 从 JDK 1.1 开始将 Unicode 字符流转换为本地编码字节流的首选方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 类。static Runtime getRuntime()返回与当前 Java 应用程序相关的运行时对象。void halt(int status)强行终止目前正在运行的 Java 虚拟机。void load(String filename)加载作为动态库的指定文件名。void loadLibrary(String libname)加载具有指定库名的动态库。long maxMemory()返回 Java 虚拟机试图使用的最大内存量。boolean removeShutdownHook(Thread hook)取消注册某个先前已注册的虚拟机关闭挂钩。void runFinalization()运行挂起 finalization 的所有对象的终止方法。static void runFinalizersOnExit(boolean value)已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法而其他线程正在操作这些对象从而导致不正确的行为或死锁。long totalMemory()返回 Java 虚拟机中的内存总量。void traceInstructions(boolean on)启用禁用指令跟踪。void traceMethodCalls(boolean on)启用禁用方法调用跟踪。2.1.3 Process不管通过那种方法启动进程后都会返回一个Process类的实例代表启动的进程该实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法Java代码  void destroy()杀掉子进程。一般情况下该方法并不能杀掉已经启动的进程不用为好。int exitValue()返回子进程的出口值。只有启动的进程执行完成、或者由于异常退出后exitValue()方法才会有正常的返回值否则抛出异常。InputStream getErrorStream()获取子进程的错误流。如果错误输出被重定向则不能从该流中读取错误输出。InputStream getInputStream()获取子进程的输入流。可以从该流中读取进程的标准输出。OutputStream getOutputStream()获取子进程的输出流。写入到该流中的数据作为进程的标准输入。int waitFor()导致当前线程等待如有必要一直要等到由该 Process 对象表示的进程已经终止。通过该类提供的方法可以实现与启动的进程之间通信达到交互的目的。2.2 实例2.2.1 创建子进程要创建子进程可以通过使用使用ProcessBuilder的start()方法和Runtime的exec()方法。()Runtime.exec()Java代码  import java.io.BufferedReader;import java.io.File;import java.io.InputStreamReader;public class Test1 {public static void main(String[] args) {try {Process p  null;String line  null;BufferedReader stdout  null;//list the files and directorys under C:\p  Runtime.getRuntime().exec(CMD.exe /C dir, null, new File(C:\\));stdout  new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line  stdout.readLine()) ! null) {System.out.println(line);}stdout.close();//echo the value of NAMEp  Runtime.getRuntime().exec(CMD.exe /C echo %NAME%, new String[] {NAMETEST});stdout  new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line  stdout.readLine()) ! null) {System.out.println(line);}stdout.close();} catch (Exception e) {e.printStackTrace();}}()ProcessBuilderJava代码  import java.io.BufferedReader;import java.io.File;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;public class Test2 {public static void main(String[] args) {try {List list  new ArrayList();ProcessBuilder pb  null;Process p  null;String line  null;BufferedReader stdout  null;//list the files and directorys under C:\list.add(CMD.EXE);list.add(/C);list.add(dir);pb  new ProcessBuilder(list);pb.directory(new File(C:\\));p  pb.start();stdout  new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line  stdout.readLine()) ! null) {System.out.println(line);}stdout.close();//echo the value of NAMEpb  new ProcessBuilder();pb.command(new String[] {CMD.exe, /C, echo %NAME%});pb.environment().put(NAME, TEST);p  pb.start();stdout  new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line  stdout.readLine()) ! null) {System.out.println(line);}stdout.close();} catch (Exception e) {e.printStackTrace();}}从启动其他程序的Java进程看已启动的其他程序输出就是一个普通的输入流可以通过getInputStream()和getErrorStream来获取。对于一般输出文本的进程来说可以将InputStream封装成BufferedReader然后就可以一行一行的对进程的标准输出进行处理。通常一个程序/进程在执行结束后会向操作系统返回一个整数值0一般代表执行成功非0表示执行出现问题。有两种方式可以用来获取进程的返回值。一是利用waitFor()该方法是阻塞的执导进程执行完成后再返回。该方法返回一个代表进程返回值的整数值。另一个方法是调用exitValue()方法该方法是非阻塞的调用立即返回。但是如果进程没有执行完成则抛出异常。2.2.2 进程阻塞问题由Process代表的进程在某些平台上有时候并不能很好的工作特别是在对代表进程的标准输入流、输出流和错误输出进行操作时如果使用不慎有可能导致进程阻塞甚至死锁。如果将以上事例中的从标准输出重读取信息的语句修改为从错误输出流中读取stdout new BufferedReader(new InputStreamReader(p.getErrorStream()));那么程序将发生阻塞不能执行完成而是hang在那里。当进程启动后就会打开标准输出流和错误输出流准备输出当进程结束时就会关闭他们。在以上例子中错误输出流没有数据要输出标准输出流中有数据输出。由于标准输出流中的数据没有被读取进程就不会结束错误输出流也就不会被关闭因此在调用readLine()方法时整个程序就会被阻塞。为了解决这个问题可以根据输出的实际先后先读取标准输出流然后读取错误输出流。但是很多时候不能很明确的知道输出的先后特别是要操作标准输入的时候情况就会更为复杂。这时候可以采用线程来对标准输出、错误输出和标准输入进行分别处理根据他们之间在业务逻辑上的关系决定读取那个流或者写入数据。针对标准输出流和错误输出流所造成的问题可以使用ProcessBuilder的redirectErrorStream()方法将他们合二为一这时候只要读取标准输出的数据就可以了。当在程序中使用Process的waitFor()方法时特别是在读取之前调用waitFor()方法时也有可能造成阻塞。可以用线程的方法来解决这个问题也可以在读取数据后调用waitFor()方法等待程序结束。总之解决阻塞的方法应该有两种(1)使用ProcessBuilder类利用redirectErrorStream方法将标准输出流和错误输出流合二为一在用start()方法启动进程后先从标准输出中读取数据然后调用waitFor()方法等待进程结束。如Java代码  import java.io.BufferedReader;import java.io.File;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;public class Test3 {public static void main(String[] args) {try {List list  new ArrayList();ProcessBuilder pb  null;Process p  null;String line  null;BufferedReader stdout  null;//list the files and directorys under C:\list.add(CMD.EXE);list.add(/C);list.add(dir1);pb  new ProcessBuilder(list);pb.directory(new File(C:\\));//merge the error output with the standard outputpb.redirectErrorStream(true);p  pb.start();//read the standard outputstdout  new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line  stdout.readLine()) ! null) {System.out.println(line);}int ret  p.waitFor();System.out.println(the return code is   ret);stdout.close();} catch (Exception e) {e.printStackTrace();}}(2)使用线程Java代码  import java.util.*;import java.io.*;class StreamWatch extends Thread {InputStream is;String type;List output  new ArrayList();boolean debug  false;StreamWatch(InputStream is, String type) {this(is, type, false);}StreamWatch(InputStream is, String type, boolean debug) {this.is  is;this.type  type;this.debug  debug;}public void run() {try {PrintWriter pw  null;InputStreamReader isr  new InputStreamReader(is);BufferedReader br  new BufferedReader(isr);String line  null;while ((line  br.readLine()) ! null) {output.add(line);if (debug)System.out.println(type    line);}if (pw ! null)pw.flush();} catch (IOException ioe) {ioe.printStackTrace();}}public List getOutput() {return output;}}Java代码  public class Test5 {public static void main(String args[]) {try {List list  new ArrayList();ProcessBuilder pb  null;Process p  null;// list the files and directorys under C:\list.add(CMD.EXE);list.add(/C);list.add(dir1);pb  new ProcessBuilder(list);pb.directory(new File(C:\\));p  pb.start();// process error and output messageStreamWatch errorWatch  new StreamWatch(p.getErrorStream(),ERROR);StreamWatch outputWatch  new StreamWatch(p.getInputStream(),OUTPUT);// start to watcherrorWatch.start();outputWatch.start();//wait for exitint exitVal  p.waitFor();//print the content from ERROR and OUTPUTSystem.out.println(ERROR:   errorWatch.getOutput());System.out.println(OUTPUT:   outputWatch.getOutput());System.out.println(the return code is   exitVal);} catch (Throwable t) {t.printStackTrace();}}}2.2.3 在java中执行java程序执行一个Java程序的关键在于(1)知道JAVA虚拟机的位置即java.exe或者java的路径(2)知道要执行的java程序的位置(3)知道该程序所依赖的其他类的位置举一个例子一目了然。(1)待执行的Java类Java代码  public class MyTest {public static void main(String[] args) {System.out.println(OUTPUT one);System.out.println(OUTPUT two);System.err.println(ERROR 1);System.err.println(ERROR 2);for(int i  0; i {System.out.printf(args[%d]  %s., i, args[i]);}}}(2)执行该类的程序Java代码  import java.util.*;import java.io.*;class StreamWatch extends Thread {InputStream is;String type;List output  new ArrayList();boolean debug  false;StreamWatch(InputStream is, String type) {this(is, type, false);}StreamWatch(InputStream is, String type, boolean debug) {this.is  is;this.type  type;this.debug  debug;}public void run() {try {PrintWriter pw  null;InputStreamReader isr  new InputStreamReader(is);BufferedReader br  new BufferedReader(isr);String line  null;while ((line  br.readLine()) ! null) {output.add(line);if (debug)System.out.println(type    line);}if (pw ! null)pw.flush();} catch (IOException ioe) {ioe.printStackTrace();}}public List getOutput() {return output;}}Java代码  public class Test6 {public static void main(String args[]) {try {List list  new ArrayList();ProcessBuilder pb  null;Process p  null;String java  System.getProperty(java.home)  File.separator  bin  File.separator  java;String classpath  System.getProperty(java.class.path);// list the files and directorys under C:\list.add(java);list.add(-classpath);list.add(classpath);list.add(MyTest.class.getName());list.add(hello);list.add(world);list.add(good better best);pb  new ProcessBuilder(list);p  pb.start();System.out.println(pb.command());// process error and output messageStreamWatch errorWatch  new StreamWatch(p.getErrorStream(),ERROR);StreamWatch outputWatch  new StreamWatch(p.getInputStream(),OUTPUT);// start to watcherrorWatch.start();outputWatch.start();//wait for exitint exitVal  p.waitFor();//print the content from ERROR and OUTPUTSystem.out.println(ERROR:   errorWatch.getOutput());System.out.println(OUTPUT:   outputWatch.getOutput());System.out.println(the return code is   exitVal);} catch (Throwable t) {t.printStackTrace();}
http://www.zqtcl.cn/news/719039/

相关文章:

  • 王野苏婉卿乐清网站优化
  • 三亚市住房和城乡建设厅网站wordpress适合企业网站模板
  • php网站建设思路方案中国空间站组合体
  • 帝国+只做网站地图厦门app定制公司
  • 网站运营推广主要做什么的高匿代理ip
  • 网站建设与维护采访稿wordpress 图床加速
  • 建设国际互联网网站完整网站开发教程
  • 一个购物交易网站怎么做网站管理功能图
  • 做有后台的网站如何提交网站地图
  • 网站建设税率多少潍坊市住房和城乡建设局网站
  • 网站图片怎么做白色背景青岛公司做网站的价格
  • 网站seo工具wordpress放视频没画面
  • 自己做个网站要多少钱o2o商城网站系统开发
  • 百度网站优化哪家好长沙抖音推广代运营公司
  • 做网站的软件worddede 后门暴网站
  • 极简风格 网站上市公司seo是什么意思
  • 商城手机网站设计网架公司十大排名
  • 在建设主题网站时邯郸房产信息网恋家网
  • 保山做网站建设做网站zwnet
  • 南阳做网站推广自助个人免费网站
  • 企业做网站怎么做高校档案室网站建设
  • 辽宁省建设厅网站升级期货交易软件定制开发
  • 网站建设公司工资设置mufen wordpress
  • 资阳网站网站建设月夜直播免费完整版
  • 自己的网站打不开了网站建设维护成本
  • 最便宜做网站c2c网站建站的标准
  • 家里电脑做网站服务器下载中国移动商旅100最新版本
  • 深圳建站公司开发费用做网站网页的工作怎么样
  • 网站工程师平均工资网站开发合同里的坑
  • 南通公司建站模板品牌网站建设小蝌蚪