一. 本章内容
- 创建&运行线程
- 查看线程
- 线程API
- 线程状态
1.1 创建&运行线程
一共有3种方式, 分别是:
- 继承Thread类, 并重写run方法
- 实现Runnable接口, 配合Thread
- FutureTask配合Thread
1.1.1 方式一: 继承Thread类, 并重写run方法
/**
* 方式一: Thread匿名内部类方法
*/
public static void create_01(){
//1.创建线程对象(以"t1"命名线程名称)
Thread t1 = new Thread("t1"){
@Override
public void run() {
log.debug("running");
}
};
//2.启动线程(交给任务调度器, 分配时间片, 交给cpu去执行)
t1.start();
log.debug("running");
}
1.1.2 方式二: 实现Runnable接口, 配合Thread
/**
* 方式二: Runnable接口 + Thread
* @desc: 把任务和线程分开 (建议)
*/
public static void create_02(){
//创建任务对象
Runnable runnable = new Runnable() {
@Override
public void run() {
//要执行的任务
log.debug("running");
}
};
//创建线程对象
Thread t2 = new Thread(runnable, "t2");
//启动线程
t2.start();
log.debug("running");
}
1.1.2.1 lambda简化方式
/**
* 方式三: lambda简化版
*/
public static void create_03(){
//任务对象
Runnable runnable = () -> log.debug("running");
//创建线程对象
// Thread t3 = new Thread(runnable, "t3");
//创建线程对象_熟练版
Thread t3 = new Thread(() -> log.debug("running"), "t3");
//启动线程
t3.start();
log.debug("running");
}
1.1.3 方式三: FutureTask配合Thread
- 定义一个未来线程的任务实现callback接口, 申明线程执行结果类型;
- 重写callback接口的call方法;
- 构造Thread线程对象;
- 调用线程的start()方法, 启动线程
/**
* 方式三: futureTask
* @throws ExecutionException
* @throws InterruptedException
*/
public static void create_04() throws ExecutionException, InterruptedException {
//创建未来线程任务
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
log.debug("running");
Thread.sleep(2000);
return 100;
}
});
Thread t = new Thread(futureTask, "t1");
t.start();
//主线程阻塞,同步等待 task 执行完毕的结果
log.debug("{}", futureTask.get());
}
1.2 观察多个线程同时运行
/**
* 线程运行_多个线程同时运行的现象
* @Author: Nisy
* @Date: 2023/05/12/12:49
*/
@Slf4j(topic = "c.MultiThreadTest")
public class MultiThreadTest {
public static void main(String[] args) {
new Thread(() -> {
while (true){
log.debug("running");
}
}, "t1").start();
new Thread(() -> {
while (true){
log.debug("running");
}
}, "t2").start();
}
}
执行结果:
结论:
- t1和t2线程是交替执行的
- t1和t2谁先先后, 我们控制不了, 是由底层的任务调度器来控制的
1.3 查看进程线程的方法
1.3.1 windows
- 任务管理器可以查看进程和线程数, 也可以杀死进程
tasklist命令查看进程taskkill命令杀死进程
1.3.2 linux
ps -ef命令查看所有进程ps -ft -p <PID>命令查看某个进程(PID)的所有线程kill命令杀死进程