1.进程和线程的基本概念
进程:
进程可以理解为一个程序的实例,就可以理解为一个应用或程序,
当程序被运行时,会把磁盘中的程序代码加载到内存,同时开启一个进行;
线程:
可以理解为进程中的一条条指令流,线程是进程的子集,将一条条的指令按照一定的顺序交给CPU,
线程是Java中最小的调度单位。
2.并行与并发的概念
并发:同一个CPU内核处理不同的指令,并发(concurrent)是同一时间应对(dealing with)多件事情的能力;
并行:不同的CPU内核同时处理不同的指令,并行(parallel)是同一时间动手做(doing)多件事情的能力;
3.创建线程的三种方式:
/**
* 方法一:
* 直接使用Thread匿名内部类的形式
* 创建线程,调用线程Thread类的start方法执行线程体
*/
@Test
public void createThread1() {
Thread th = new Thread(() -> {
log.debug("线程体开始执行");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("线程方法执行结束");
});
th.start();
}
/**
* 方法二:
* 使用Runnable接口,
* 使用匿名内部类,重写run方法
* 把创建的runnable接口引用放入Thread示例
* 调用Thread的start方法执行线程体
*/
public void createThread2() {
Runnable r = () -> {
log.info("to do someThing");
};
Thread re = new Thread(r);
re.start();
}
/**
* 方式三:
* FutureTask 配合 Thread
*/
@Test
public void createThread3() throws ExecutionException, InterruptedException {
// 创建任务对象
FutureTask<Integer> task3 = new FutureTask<>(() -> {
log.debug("hello");
return 100;
});
// 参数1 是任务对象; 参数2 是线程名字,推荐
new Thread(task3, "t3").start();
// 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task3.get();
log.debug("结果是:{}", result);
}
4.查看进程的方法
windows
任务管理器可以查看进程和线程数,也可以用来杀死进程
tasklist 查看进程
taskkill 杀死进程
linux
ps -fe 查看所有进程
ps -fT -p 查看某个进程(PID)的所有线程
kill 杀死进程
top 按大写 H 切换是否显示线程
top -H -p 查看某个进程(PID)的所有线程