java有多进程吗?我这样做算是多进程么?

时间:2021-02-20 16:42:26
java每执行一个编译好的文件是不是都是独立启动一个线程?
写了一个爬虫的小例子:
package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;

public class SpiderTest{
public static void main(String[] args) throws IOException, InterruptedException {
URL url =new URL("http://www.baidu.com");
Proxy proxy = new Proxy(Proxy.Type.HTTP,new InetSocketAddress("118.26.147.119",80)); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);
connection.setConnectTimeout(10000);
connection.setReadTimeout(100000);
connection.setRequestMethod("GET");
connection.setUseCaches(true);
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
connection.connect();
System.out.println(connection.getResponseCode());
int i = connection.getResponseCode();
String content = "";
if(i==HttpURLConnection.HTTP_OK){
InputStream in = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in,"gbk"));
String line = "";
while((line=br.readLine())!=null){
content+=line+"\n\r";
}
System.out.println(content);
}

}
}


package test;

import java.io.IOException;
import java.util.Scanner;

public class ControlTest {
public static void main(String[] args) throws IOException {
Process process = Runtime.getRuntime().exec("java SpiderTest");
Process process2 = Runtime.getRuntime().exec("java SpiderTest");
Process process3 = Runtime.getRuntime().exec("java SpiderTest");
Process process4 = Runtime.getRuntime().exec("java SpiderTest");
Process process5 = Runtime.getRuntime().exec("java SpiderTest");
Process process6 = Runtime.getRuntime().exec("java SpiderTest");
Process process7 = Runtime.getRuntime().exec("java SpiderTest");
Process process8 = Runtime.getRuntime().exec("java SpiderTest");
Process process9 = Runtime.getRuntime().exec("java SpiderTest");
Process process11 = Runtime.getRuntime().exec("java SpiderTest");
Process process12 = Runtime.getRuntime().exec("java SpiderTest");
Process process13 = Runtime.getRuntime().exec("java SpiderTest");
Process process14 = Runtime.getRuntime().exec("java SpiderTest");
Process process15 = Runtime.getRuntime().exec("java SpiderTest");
Process process16 = Runtime.getRuntime().exec("java SpiderTest");

System.out.print(process);
}


}


1、这里面我在ControlTest 这里面执行的process是不是独立的 进程
2、我如果想往里面传参数的话是不是只能通过String args[]传参数?
3、我如何监控这些进程的运行情况,在windows的进程管理器中只能看到javaw.exe进程。
4、我这个是把编译好的SpiderTest.class文件放到了根目录下,有没有办法直接执行build里的class文件?
谢谢!

5 个解决方案

#1


1、这里面我在ControlTest 这里面执行的process是不是独立的进程?
是,Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例。
2、我如果想往里面传参数的话是不是只能通过String args[]传参数?
进程间通讯方法不止一种。命令行参数可以。
3、我如何监控这些进程的运行情况,在windows的进程管理器中只能看到javaw.exe进程。
java SpiderTest 也是java应用,所以只能看到java进程。
可以考虑进程间通讯。
4、我这个是把编译好的SpiderTest.class文件放到了根目录下,有没有办法直接执行build里的class文件?
java -cp build完成路径 SpiderTest

#2


如果你是同一台机器上,多个进程感觉真没有必要,一般采用多线程就能够很好的解决了啊。

#3


引用 2 楼 rumlee 的回复:
如果你是同一台机器上,多个进程感觉真没有必要,一般采用多线程就能够很好的解决了啊。

我现在想抓取多个网站内容,每个网站用多线程去抓:
那么我用多线程来区分不同网站,再用多个爬虫分别在多个线程去抓网站会不会出问题?
如果用一个进程抓一个网站,同时有多个线程控制多个爬虫去抓是不是更好一点?

#4


这样做没有任何好处. 缺点倒是有一些: 比如,除了你的工作线程意外,每个java虚拟机都开了若干额外的线程(例如GC线程),消耗系统资源; 额外的内存占用等等.

有人研究吧不同Java程序跑在同一个虚拟机里,没有人研究吧同一个程序泡在多个虚拟机里. (试验集群除外)

#5


引用 4 楼 ArayChou 的回复:
这样做没有任何好处. 缺点倒是有一些: 比如,除了你的工作线程意外,每个java虚拟机都开了若干额外的线程(例如GC线程),消耗系统资源; 额外的内存占用等等.

有人研究吧不同Java程序跑在同一个虚拟机里,没有人研究吧同一个程序泡在多个虚拟机里. (试验集群除外)

那我现在想在同一时刻对多个网站进行抓取,并且每个网站都有多个爬虫线程运行,这种情况怎么办?线程中嵌套线程么?

#1


1、这里面我在ControlTest 这里面执行的process是不是独立的进程?
是,Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例。
2、我如果想往里面传参数的话是不是只能通过String args[]传参数?
进程间通讯方法不止一种。命令行参数可以。
3、我如何监控这些进程的运行情况,在windows的进程管理器中只能看到javaw.exe进程。
java SpiderTest 也是java应用,所以只能看到java进程。
可以考虑进程间通讯。
4、我这个是把编译好的SpiderTest.class文件放到了根目录下,有没有办法直接执行build里的class文件?
java -cp build完成路径 SpiderTest

#2


如果你是同一台机器上,多个进程感觉真没有必要,一般采用多线程就能够很好的解决了啊。

#3


引用 2 楼 rumlee 的回复:
如果你是同一台机器上,多个进程感觉真没有必要,一般采用多线程就能够很好的解决了啊。

我现在想抓取多个网站内容,每个网站用多线程去抓:
那么我用多线程来区分不同网站,再用多个爬虫分别在多个线程去抓网站会不会出问题?
如果用一个进程抓一个网站,同时有多个线程控制多个爬虫去抓是不是更好一点?

#4


这样做没有任何好处. 缺点倒是有一些: 比如,除了你的工作线程意外,每个java虚拟机都开了若干额外的线程(例如GC线程),消耗系统资源; 额外的内存占用等等.

有人研究吧不同Java程序跑在同一个虚拟机里,没有人研究吧同一个程序泡在多个虚拟机里. (试验集群除外)

#5


引用 4 楼 ArayChou 的回复:
这样做没有任何好处. 缺点倒是有一些: 比如,除了你的工作线程意外,每个java虚拟机都开了若干额外的线程(例如GC线程),消耗系统资源; 额外的内存占用等等.

有人研究吧不同Java程序跑在同一个虚拟机里,没有人研究吧同一个程序泡在多个虚拟机里. (试验集群除外)

那我现在想在同一时刻对多个网站进行抓取,并且每个网站都有多个爬虫线程运行,这种情况怎么办?线程中嵌套线程么?