Java线程
3.1线程的创建和运行
方法1
//创建线程对象
Thread t = new Thread() {
public void run() {
// 要执行的任务
}
};
// 启动线程
t.start();
方法2
Runnable runnable = new Runnable() {
public void run() {
// 要执行的任务
}
};
// 创建线程对象
Thread t = new Thread(runnable);
//启动线程
t.start();
Java8 使用lambda表达式
Runnable r = () -> { // 要执行的任务};
原理之Thread 与 Runnable 的关系
分析 thread 的源码,理清它与Runnable的关系
小结
- 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了
- 用Runnable 更容易与线程池等高级API配合
- 用Runnable 让任务类脱离了Thread 继承体系,更灵活
方法3
FutureTask 能够接受Callable类型的参数,用来处理有返回结果的情况
//创建任务对象
FutureTask<T> task = new FutureTask( ()-> {
log.debug("hello");
return 100;
})
// 参数1 是任务对象;参数2 是线程名字 推荐
new Thread(task,"t3").start();
//主线程阻塞,同步等待task 执行完毕的结果
T result = task.get();
log.debug("结果是:{}",result);
3.3查看进程线程的方法
Windows
- 任务管理器可以查看进程和线程数,也可以用来杀死进程
- tasklist 查看进程
- taskkill 杀死进程
Linux
- ps -fe 查看所有进程
- ps - ft -p<PID> 查看某个进程(PID)的所有线程
- kill 杀死进程
- top 按大写H切换是否显示线程
- top -H -p <PID>查看某个进程(PID)的所有线程
JAVA
- JPS 命令查看所有Java进程
- jstack <PID>查看某个Java进程<PID> 的所有线程状态
- Jconsole 查看某个Java进程中线程的运行情况(图形界面)