0812(030天 线程/进程01)
每日一狗(田园犬西瓜瓜)
线程/进程01
1. 基本概念
配置:单CPU单核
进程:
- 系统分配资源的独立单位
- 程序的执行过程
- 相互之间隔离,不允许相互之间直接进行调度
- 进程中间可以包含多个线程
cpu嘎嘎快,线程中多数为阻塞状态,再在进程中间开了一个线程
线程:
同一线程中可以存在多个顺序流
- 多个线程可以存在于单个进程中
- cpu将时间划分为若干个小节,时间一到,换下一个线程
- 运行时会暂存一个计数器、寄存器和栈帧
- cpu调度的最小单位
状态
- 创建:进程创建后进入就绪状态
- 就绪:除了cpu之外啥都有了。
- 运行:
- 阻塞:需要达到某种特定要求才能继续运行,满足需求后重新进入就绪状态
- 终止:
2. 编程使用
2.1 创建进程
案例1:使用cmd运行段指令后关闭,将反馈信息输出到终端
package com.yang3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test01 {
// 创建进程,运行cmd 中 ipconfig/all,获取终端运行结果
public static void main(String[] args) throws IOException {
test1();
test2();
}
// 启动进程方法2
public static void test2() throws IOException {
Process p = Runtime.getRuntime().exec("cmd /c ipconfig/all");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "GBK"));
String ss = "";
while ((ss = br.readLine()) != null) {
System.out.println(ss);
}
}
// 启动进程方法1:
public static void test1() throws IOException {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "ipconfig/all");
Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "GBK"));
String ss = "";
while ((ss = br.readLine()) != null) {
System.out.println(ss);
}
}
}
案例二:从终端获取一段java程序代码,将编译执行结果反馈到终端输出
package com.yang3;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class Test02 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
File file = new File("T1.java");
// 获取输入程序
if (file.exists()) {
file.delete();
System.out.println("文件已存在");
}
StringBuilder sb = new StringBuilder();
String ss = "";
while (true) {
ss = br.readLine();
if ("quit".equals(ss)) {
break;
}
sb.append(ss + "\n");
}
br.close();
// 写出文件
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
pw.print(sb);
pw.close();
// 编译
boolean flag = true;
Process p = Runtime.getRuntime().exec("cmd /c javac T1.java");
BufferedReader br2 = new BufferedReader(new InputStreamReader(p.getErrorStream(), "GBK"));
while ((ss = br2.readLine()) != null) {
System.err.print(ss);
flag = false;
}
br2.close();
// 运行程序并将反馈信息输出到终端
if (flag) {
long s1 = System.currentTimeMillis();
Process p1 = Runtime.getRuntime().exec("cmd /c java T1");
System.out.print(System.currentTimeMillis() - s1);
BufferedReader br3 = new BufferedReader(new InputStreamReader(p1.getInputStream(), "GBK"));
while ((ss = br3.readLine()) != null) {
System.out.println(ss);
}
br3.close();
}
}
}
扩展小芝士
- 谈优化,先谈标准
- 输入输出判定:站在进程角度想,进来的数据就是输入流,出去的就是输出流