创建线程的三种常见方法
方法一
继承Thread类
/**
* 继承Thread类
*/
@Slf4j
public class BuildThread1 extends Thread{
@Override
public void run() {
log.debug("running");
}
public static void main(String[] args) {
BuildThread1 buildThread1 = new BuildThread1();
buildThread1.setName("继承Thread类创建的线程");
buildThread1.start();
}
}
结果
2021-02-09 16:07:04.090 [继承Thread类创建的线程] DEBUG com.xc.thread.BuildThread1 - running
也直接new一个 Thread
@Slf4j(topic = "method01")
public class BuildThread01 {
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run() {
log.debug("running");
}
};
thread.setName("直接使用thread创建线程");
thread.start();
}
}
结果
2021-02-09 16:08:50.892 [直接使用thread创建线程] DEBUG method01 - running
方法二
实现Runnable接口
/**
* 实现Runnable接口
*/
@Slf4j
public class BuildThread2 implements Runnable{
@Override
public void run() {
log.debug("running");
}
public static void main(String[] args) {
BuildThread2 buildThread2 = new BuildThread2();
Thread thread = new Thread(buildThread2);
thread.setName("实现Runnable接口创建的线程");
thread.start();
}
}
结果
2021-02-09 16:11:11.753 [实现Runnable接口创建的线程] DEBUG com.xc.runnable.BuildThread2 - running
也可以这样写
@Slf4j(topic = "method02")
public class BuildThread02 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
log.debug("running");
}
};
Thread thread = new Thread(runnable);
thread.setName("runnable配合thread创建线程");
thread.start();
}
}
结果
2021-02-09 16:11:34.245 [runnable配合thread创建线程] DEBUG method02 - running
方法三
实现callable接口
/**
* 实现callable接口
*/
@Slf4j
public class BuildThread3 implements Callable<String> {
@Override
public String call() throws Exception {
log.debug("running");
return "ok";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
BuildThread3 buildThread3 = new BuildThread3();
//创建服务
ExecutorService service = Executors.newFixedThreadPool(1);
//提交执行
Future<String> task = service.submit(buildThread3);
log.debug("{}",task.get());
//关闭服务
service.shutdownNow();
}
}
结果
2021-02-09 16:16:27.380 [pool-2-thread-1] DEBUG com.xc.callable.BuildThread3 - running
2021-02-09 16:16:27.382 [main] DEBUG com.xc.callable.BuildThread3 - ok
也可以FutureTask配合Thread创建线程,因为FutureTask能够接收Callable类型的参数
@Slf4j(topic = "method03")
public class BulidThread03 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
log.debug("running");
Thread.sleep(2000);
return "ok";
}
});
Thread thread = new Thread(task, "FutureTask配合Thread创建线程");
thread.start();
log.debug("{}", task.get());
}
}
结果
2021-02-09 16:14:47.676 [FutureTask配合Thread创建线程] DEBUG method03 - running
2021-02-09 16:14:49.678 [main] DEBUG method03 - ok