1. 创建和运行线程
具体代码
new Thread(){
@Override
public void run() {
log.debug("running");
}
}.start();
log.debug("main running");
// 原生方法
Runnable runnable = new Runnable() {
@Override
public void run() {
log.debug("runnable running");
}
};
new Thread(runnable, "t2").start();
log.debug("main running");
// lambda 表达式
Runnable runnable = () -> log.debug("runnable running");
new Thread(runnable, "t3").start();
log.debug("main running");
FutureTask<Integer> futureTask = new FutureTask<>(
new Callable<Integer>() {
@Override
public Integer call() throws Exception {
log.debug("hahah");
return 100;
}
}
);
new Thread(futureTask).start();
log.debug("结果是:{}",futureTask.get());
关系
- 方法1 是把线程和任务合并在了一起,方法2、3 是把线程和任务分开了
- 用 Runnable 让任务类脱离了 Thread 继承体系,更灵活
- FutureTask可以实现两个线程传递变量
查看进程线程的方法
- Windows
- Linux
- ps -fe、 kill 、top 、 top -H -p <PID> 查看某个进程的所有线程
- Java
- jps查看所有java进程
- jstack <pid> 查看进程的所有线程
- jconsole 来查看某个 Java 进程中线程的运行情况(图形界面)
2. 线程运行原理
栈与栈帧
- 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法