线程创建方式1:直接使用Thread
创建maven工程,pom依赖如下:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
resources目录下创建logback.xm文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration
xmlns="http://ch.qos.logback/xml/ns/logback"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback logback.xsd">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{HH:mm:ss} [%t] %logger - %m%n</pattern>
</encoder>
</appender>
<logger name="c" level="debug" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="ERROR">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
import lombok.extern.slf4j.Slf4j;
/**
* 线程创建方式1:直接使用Thread
*/
@Slf4j(topic = "c.ThreadCreationWay1")
public class ThreadCreationWay1 {
public static void main(String[] args) {
// 创建线程对象
// Thread t = new Thread(/* "t" 也可以在构造函数里指定线程名*/) {
//
// @Override
// public void run() {
// // 要执行的任务
// log.debug("running");
// }
//
// };
// lambda
Thread t = new Thread(() -> log.debug("running")); // 代码只有1行可省略大括号
// 设置线程名
t.setName("t");
// 启动线程
t.start();
log.debug("running");
}
}
线程创建方式2:使用Runnable结合Thread
import lombok.extern.slf4j.Slf4j;
/**
* 线程创建方式2:使用Runnable结合Thread
*/
@Slf4j(topic = "c.ThreadCreationWay2")
public class ThreadCreationWay2 {
public static void main(String[] args) {
// Runnable r = new Runnable() {
//
// @Override
// public void run() {
// // 要执行的任务
// log.debug("running");
// }
//
// };
// lambda
Runnable r = () -> log.debug("running"); // 1行代码大括号可省略
// Thread t = new Thread(r, "t"); // 构造函数也可指定线程名
Thread t = new Thread(r);
// 设置线程名
t.setName("t");
// 启动线程
t.start();
log.debug("running");
}
}
线程创建方式3:使用FutureTask结合Thread
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 线程创建方式3:使用FutureTask结合Thread
* FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况
*/
@Slf4j(topic = "c.ThreadCreationWay3")
public class ThreadCreationWay3 {
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(2000);
// return 100;
// }
// });
FutureTask<Integer> task = new FutureTask<>(() -> {
log.debug("running");
Thread.sleep(2000);
return 100;
});
Thread t1 = new Thread(task, "t1");
t1.start();
// 阻塞式等待返回结果
log.debug("{}", task.get());
}
}