目录
2.1 创建和运行线程
2.1.1 直接使用Thread类创建线程
package com.java_thread;
import lombok.extern.slf4j.Slf4j;
/**
* 创建线程: 直接使用Thread类创建线程
*/
@Slf4j(topic = "c.CreateThread1")
public class CreateThread1 {
public static void main(String[] args) {
Thread t1 = new Thread() {
@Override
public void run() {
log.debug("running");
}
};
t1.setName("t1");
t1.start();
log.debug("running");
}
}
//使用labmda来简化操作
Thread thread = new Thread(() -> {
log.debug("running");
}, "t1");
thread.start();
2.1.2 使用Runnable配合Thread创建线程
package com.java_thread;
import lombok.extern.slf4j.Slf4j;
/**
* 创建线程: 使用Runnable配合Thread
* 1、Thread代表线程
* 2、Runnable代表可运行的任务(线程要执行的代码)
*/
@Slf4j(topic = "c.CreateThread2")
public class CreateThread2 {
public static void main(String[] args) {
//1、创建可运行的任务
Runnable runnable = new Runnable() {
@Override
public void run() {
log.debug("hello");
}
};
//2、创建线程对象
Thread thread = new Thread(runnable);
//3、启动线程
thread.start();
log.debug("world");
}
}
//使用lambda表达式简化操作
Runnable runnable1 = () -> log.debug("running");
Thread t = new Thread(runnable1, "t1");
t.start();
2.1.3 前两种创建方式的小结
- 方法1是把线程和任务合并在一起了,方法2是把线程和任务分开了
- 用Runnable更容易与线程池等高等级API配合
- 用Runnable让任务类脱离了Thread继承体系,更加灵活
2.1.4 FutureTask配合Thread创建线程
FutureTask能够接收Callable类型的参数,用来处理有返回结果的情况
package com.java_thread;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 创建线程: FutureTask配合Thread创建线程
*/
@Slf4j(topic = "c.CreateThread3")
public class CreateThread3 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
log.debug("running...");
Thread.sleep(1000);
return 100;
}
});
Thread t = new Thread(task);
t.setName("t1");
t.start();
log.debug("{}", task.get());
}
}