【发布时间】:2017-05-22 09:07:34
【问题描述】:
我向您提出了一个关于 java 中发生的线程、进程和上下文切换的问题。我已经阅读了与此知识有关的其他问题,但我希望有人就我不太了解的一些事情澄清某些方面。我已经为这方面做了一个例子。
假设我们有一个类接受一个命令,然后运行(在一个新线程中)给定的命令,并创建 3 个额外的线程来接受它的每个流(输入、错误、输出)然后打印(对于第一个二)得到什么。
public class ThreadA extends Thread {
String command;
private Frame container;
public ThreadA(String command,Frame container) {
this.command = command;
this.container = container;
}
@Override
public void run() {
Process p = null;
try {
p = Runtime.getRuntime().exec(command);
new ErrorReadThread(p,container).start();
new InputReadThread(p,container).start();
new OutputReadThread(p).start();
int exitValue = p.waitFor();
System.out.println("Exit value is : " + exitValue);
} catch (IOException ex) {
Logger.getLogger(ThreadA.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadA.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
其他 3 种类型的线程只是将 Process 对象作为参数,因此它们为它们获取正确的流,并在它们的运行方法中打印出从流中读取的内容(用于输入/错误,显然不是用于输出) .
在主类中,我们有以下内容:
public static void main(String[] args) {
String[] listOfCommands = null;
MainFrame frame = new MainFrame();
SwingUtilities.invokeLater(()->{
frame.setVisible(true);
});
//suppose we initialize list with many different command
for (String string : listOfCommands) {
new ThreadA(string,frame).start();
}
}
现在,假设在 errorstream 线程上读取的某一行上,我希望它触发一个 update(Graphics g) 或传递给它的 Frame 容器上的 repaint() 方法。我也想在输入流线程上使用相同的逻辑。关于这个特定示例,我有几个问题(请注意,代码部分可能存在问题,我对它背后的逻辑以及实际发生的情况更感兴趣):
在每个新线程中创建的每个进程是否都有自己的虚拟空间地址?
进程中包含哪些线程?既然知道每个进程都有自己的线程,那么在上面的例子中,进程中包含哪些线程?
由于代码的编写方式,上下文切换何时发生?在流线程内部,它会在哪里调用框架容器中的某些方法?
每个进程是否代表应用程序的一个子进程?在这种情况下,是否意味着每个进程都是作为 java 进程的子进程创建的?
-
如果每个进程确实是子进程,是否意味着上下文切换仅限于线程上下文,每个不同进程中的所有线程实际上只执行线程上下文切换?
如果我的问题已经有了答案,请给我链接。我已经阅读了与此相关的问题和答案,但我没有找到关于在新线程上运行多个进程时会发生什么的解释。
【问题讨论】:
标签: java multithreading process threadpool