创建和运行线程
方法一
Thread thread = new Thread() {
@Override
public void run() {
log.debug("running");
}
};
thread.setName("t1");
thread.start();
log.debug("running");
方法二
// 创建任务对象
Runnable runnable = new Runnable() {
@Override
public void run() {
log.debug("running");
}
};
// 参数 1 是任务对象;参数 2 是线程名字,推荐
Thread t1 = new Thread(runnable, "t1");
t1.start();
Java 8 以后可以使用 lambda 精简代码
// 创建任务对象
Runnable runnable = () -> log.debug("running");
// 参数 1 是任务对象;参数 2 是线程名字,推荐
Thread t1 = new Thread(runnable, "t1");
t1.start();
原理之 Thread 与 Runnable 的关系
- 分析 Thread 的源码,理清它与 Runnable 的关系
小结
- 方法 1 是把线程和任务合并在了一起,方法 2 是把线程和任务分开了
- 用 Runnable 更容易与线程池等高级 API 配合
- 用 Runnable 让任务类脱离了 Thread 继承体系,更灵活
方法三,FutureTask 配合 Thread
- FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况
// 创建任务对象
FutureTask<Integer> futureTask = new FutureTask<>(() -> {
log.debug("running");
return 100;
});
// 参数 1 是任务对象;参数 2 是线程名字,推荐
new Thread(futureTask, "t1").start();
// 主线程阻塞,同步等待 task 执行完毕的结果
Integer integer = futureTask.get();
log.debug("结果是:{}", integer);
查看进程线程的方法
Windows
- 任务管理器可以查看进程和线程数
- tasklist 查看进程
- taskkill 杀死进程
Linux
- ps -fe 查看所有进程
- ps -fT -p 查看某个进程(PID)的所有线程
- kill 杀死进程
- top 按大写 H 切换是否显示线程
- top -H -p 查看某个进程(PID)的所有线程
Java
- jps 命令查看所有 Java 进程
- jstack 查看某个 Java 进程(PID)的所有线程状态
- jconsole 来查看某个 Java 进程中线程的运行情况(图形界面)