【并发编程】Java创建多线程的五种方式

1. 继承Thread类#

Copy
import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; /** * 继承Thread类创建多线程单元测试 * * @author CL */ @Slf4j public class ThreadTest { @Test public void testThread() { for (int i = 1; i <= 5; i++) { new MyThread("thread-" + i).start(); } } /** * 创建线程 */ class MyThread extends Thread { public MyThread(String name) { super(name); } @Override public void run() { log.info(Thread.currentThread().getName() + " 正在执行任务..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }

  控制台打印:

Copy
21:41:48.690 [thread-1] INFO com.c3stones.test.MyThread - thread-1 正在执行任务... 21:41:48.690 [thread-3] INFO com.c3stones.test.MyThread - thread-3 正在执行任务... 21:41:48.690 [thread-5] INFO com.c3stones.test.MyThread - thread-5 正在执行任务... 21:41:48.690 [thread-4] INFO com.c3stones.test.MyThread - thread-4 正在执行任务... 21:41:48.690 [thread-2] INFO com.c3stones.test.MyThread - thread-2 正在执行任务...

2. 实现Runnable接口(包含Java8 Lambda方式)#

Copy
import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; /** * 实现Runnable接口创建多线程单元测试 * * @author CL */ @Slf4j public class RunnableTest { @Test public void testRunnable() { MyRunnable myRunnable = new MyRunnable(); for (int i = 1; i <= 5; i++) { new Thread(myRunnable, "thread-" + i).start(); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } // java8 lambda方式 for (int i = 1; i <= 5; i++) { new Thread(() -> { log.info(Thread.currentThread().getName() + " 正在执行任务..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }, "lambda-thread-" + i).start(); } } /** * 创建线程 */ class MyRunnable implements Runnable { @Override public void run() { log.info(Thread.currentThread().getName() + " 正在执行任务..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }

  控制台打印:

Copy
21:44:56.808 [thread-1] INFO com.c3stones.test.MyRunnable - thread-1 正在执行任务... 21:44:56.807 [thread-2] INFO com.c3stones.test.MyRunnable - thread-2 正在执行任务... 21:44:56.807 [thread-4] INFO com.c3stones.test.MyRunnable - thread-4 正在执行任务... 21:44:56.808 [thread-5] INFO com.c3stones.test.MyRunnable - thread-5 正在执行任务... 21:44:56.808 [thread-3] INFO com.c3stones.test.MyRunnable - thread-3 正在执行任务... 21:44:58.899 [lambda-thread-3] INFO com.c3stones.test.RunnableTest - lambda-thread-3 正在执行任务... 21:44:58.899 [lambda-thread-1] INFO com.c3stones.test.RunnableTest - lambda-thread-1 正在执行任务... 21:44:58.900 [lambda-thread-4] INFO com.c3stones.test.RunnableTest - lambda-thread-4 正在执行任务... 21:44:58.900 [lambda-thread-2] INFO com.c3stones.test.RunnableTest - lambda-thread-2 正在执行任务... 21:44:58.900 [lambda-thread-5] INFO com.c3stones.test.RunnableTest - lambda-thread-5 正在执行任务...

3. 实现Callable接口(包含Java8 Lambda方式)#

Copy
import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * 实现Callable接口创建多线程单元测试 * * @author CL */ @Slf4j public class CallableTest { @Test public void testCallable() { MyCallable myCallable = new MyCallable(); for (int i = 1; i <= 5; i++) { FutureTask<String> futureTask = new FutureTask<>(myCallable); new Thread(futureTask, "thread-" + i).start(); try { String result = futureTask.get(); log.info("thread-" + i + " 返回结果:" + result); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } // java8 lambda方式 for (int i = 1; i <= 5; i++) { FutureTask<String> futureTask = new FutureTask<>(() -> { log.info(Thread.currentThread().getName() + " 正在执行任务..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return Thread.currentThread().getName(); }); new Thread(futureTask, "lambda-thread-" + i).start(); try { String result = futureTask.get(); log.info("lambda-thread-" + i + " 返回结果:" + result); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } } /** * 创建线程 */ class MyCallable implements Callable<String> { @Override public String call() { log.info(Thread.currentThread().getName() + " 正在执行任务..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return Thread.currentThread().getName(); } } }

  控制台打印:

Copy
21:46:31.805 [thread-1] INFO com.c3stones.test.MyCallable - thread-1 正在执行任务... 21:46:32.818 [main] INFO com.c3stones.test.CallableTest - thread-1 返回结果:thread-1 21:46:32.819 [thread-2] INFO com.c3stones.test.MyCallable - thread-2 正在执行任务... 21:46:33.820 [main] INFO com.c3stones.test.CallableTest - thread-2 返回结果:thread-2 21:46:33.821 [thread-3] INFO com.c3stones.test.MyCallable - thread-3 正在执行任务... 21:46:34.822 [main] INFO com.c3stones.test.CallableTest - thread-3 返回结果:thread-3 21:46:34.822 [thread-4] INFO com.c3stones.test.MyCallable - thread-4 正在执行任务... 21:46:35.822 [main] INFO com.c3stones.test.CallableTest - thread-4 返回结果:thread-4 21:46:35.822 [thread-5] INFO com.c3stones.test.MyCallable - thread-5 正在执行任务... 21:46:36.822 [main] INFO com.c3stones.test.CallableTest - thread-5 返回结果:thread-5 21:46:36.877 [lambda-thread-1] INFO com.c3stones.test.CallableTest - lambda-thread-1 正在执行任务... 21:46:37.878 [main] INFO com.c3stones.test.CallableTest - lambda-thread-1 返回结果:lambda-thread-1 21:46:37.878 [lambda-thread-2] INFO com.c3stones.test.CallableTest - lambda-thread-2 正在执行任务... 21:46:38.878 [main] INFO com.c3stones.test.CallableTest - lambda-thread-2 返回结果:lambda-thread-2 21:46:38.878 [lambda-thread-3] INFO com.c3stones.test.CallableTest - lambda-thread-3 正在执行任务... 21:46:39.878 [main] INFO com.c3stones.test.CallableTest - lambda-thread-3 返回结果:lambda-thread-3 21:46:39.878 [lambda-thread-4] INFO com.c3stones.test.CallableTest - lambda-thread-4 正在执行任务... 21:46:40.878 [main] INFO com.c3stones.test.CallableTest - lambda-thread-4 返回结果:lambda-thread-4 21:46:40.878 [lambda-thread-5] INFO com.c3stones.test.CallableTest - lambda-thread-5 正在执行任务... 21:46:41.879 [main] INFO com.c3stones.test.CallableTest - lambda-thread-5 返回结果:lambda-thread-5

4. 项目地址#

  thread-demo

posted @   C3Stones  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2017-03-28 蓝桥杯 历届试题 PREV-1 核桃的数量
点击右上角即可分享
微信分享提示
CONTENTS