java问题:什么是线程组?
在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()主工作流程中产生一个线程,则产生的线程属于main这个线程组管理的一员。简单地说,线程组就是由线程组成的管理线程的类,这个类是java.lang.ThreadGroup类。定义一个线程组,通过以下代码可以实现。
ThreadGroup group=new ThreadGroup("group")
;Thread thread=new Thread(group,"the first thread of group")
;ThreadGroup类中的某些方法,可以对线程组中的线程产生作用。
例如,setMaxPriority()方法可以设定线程组中的所有线程拥有最大的优先权。
所有线程都隶属于一个线程组。那可以是一个默认线程组,亦可是一个创建线程时明确指定的组。
在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。
每个应用都至少有一个线程从属于系统线程组。
若创建多个线程而不指定一个组,它们就会自动归属于系统线程组。
线程组也必须从属于其他线程组。必须在构建器里指定新线程组从属于哪个线程组。
若在创建一个线程组的时候没有指定它的归属,则同样会自动成为系统线程组的一名属下。
因此,一个应用程序中的所有线程组最终都会将系统线程组作为自己的“父” -----------------河南新华
Java进程如何创建?有哪些技巧?
在java中创建进程有两种形式:
1.使用Runtime的exec(String cmdarray[])方法创建进程
代码如下:
String [] cmd={"cmd","/c","start dir"};
Runtime rt = Runtime.getRuntime();
Process proc=rt.exec(cmd)
2.使用ProcessBuilder的start()方法创建进程
代码如下:
ProcessBuilder pb=new ProcessBuilder("cmd","/C","start","netstat");
Process ps=pb.start();
除以上列出的命令外,还可以通过进程调起计算机、文本编辑器等。
调起计算器代码为:Runtime.getRuntime.exec("calc");
调起文本编辑器为:Runtime.getRuntime.exec("notepad");
在JDK中,与进程有直接关系的类为Java.lang.Process,它是一个抽象类。在JDK中也提供了一个实现该抽象类的ProcessImpl类,如果用户创建了一个进程,那么肯定会伴随着一个新的ProcessImpl实例。同时和进程创建恰当相关的还有还有ProcessBuilder。
下面介绍几种创建进程的方法。
ProcessBuilder.start()方法
Processclass是一个抽象类,在它里面主要有几个抽象方法,如下:
ProcessBuilder是一个最终类,它有两个构造器,构造器中传递的是需要创建的进程的命令参数
- 第一个构造器是将命令参数放进List当中传进去
- 第二构造器基于不定长弦的形式传进去。
ProcessBuilder.start方法来建立一个本地的进程。如果希望在新创建的进程中使用当前的目录和环境变量,则不需要任何配置,直接将命令行和参数设置为ProcessBuilder中,然后调用start方法,就获得进步的引用。
也可以先配置环境变量和工作目录,然后创建进程。
可以预先配置ProcessBuilder的属性是通过ProcessBuilder创建进程的最大优点。而且可以在后面的使用中转换需要去更改代码中pb变量的属性。如果后续代码修改了其属性,那么会影响到修改后用start方法创建的进程,对修改之前创建的进程实例没有影响。
2.Runtime.exec()方法
可以发现,实际上通过Runtime类的执行创建进程的话,最终还是通过ProcessBuilder类的start方法来创建的。

