Java多线程的七种创建方式:从基础到高级,一文读懂!
在Java编程中,多线程是实现高并发、提高程序性能的重要手段。掌握多种线程创建方式,可以帮助我们更好地应对复杂的业务场景。本文将详细介绍Java中常见的七种线程创建方式,从基础到高级,带你快速掌握!
一、继承 Thread
类
继承 Thread
类是最简单的线程创建方式之一。通过重写 run()
方法实现线程逻辑,然后调用 start()
方法启动线程。
public class Demo1 extends Thread {
@Override
public void run() {
System.out.println(this + " is running...");
}
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
Demo1 demo2 = new Demo1();
demo1.start();
demo2.start();
}
}
这种方式简单直接,但缺点是无法继承其他类(因为Java不支持多继承)。
二、实现 Runnable
接口
实现 Runnable
接口是更灵活的方式。Runnable
接口定义了一个 run()
方法,通过将其实例传递给 Thread
类来启动线程。
public class Demo2 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread() + " is running...");
}
public static void main(String[] args) {
Thread thread1 = new Thread(new Demo2());
Thread thread2 = new Thread(new Demo2());
thread1.start();
thread2.start();
}
}
这种方式的优点是可以避免继承 Thread
类带来的限制。
三、匿名内部类
匿名内部类可以快速实现线程逻辑,无需单独定义类。它可以继承 Thread
类或实现 Runnable
接口。
public class Demo3 {
public static void main(String[] args) {
// 方式1:继承 Thread 类
new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread() + " is running...");
}
}.start();
// 方式2:实现 Runnable 接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread() + " is running...");
}
}).start();
}
}
匿名内部类适合快速实现简单的线程逻辑,代码更加简洁。
四、实现 Callable
接口
Callable
接口是 Runnable
的增强版,支持返回值和抛出异常。它通过 FutureTask
封装任务,并结合 Thread
启动。
public class Demo4 implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("正在执行新建线程任务");
Thread.sleep(2000);
return "新建线程睡了2s后返回执行结果";
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
Demo4 d = new Demo4();
FutureTask<String> task = new FutureTask<>(d);
Thread t = new Thread(task);
t.start();
System.out.println("提前完成任务...");
String result = task.get();
System.out.println("线程执行结果为:" + result);
}
}
这种方式适用于需要获取线程执行结果的场景,但需要注意线程阻塞问题。
五、通过线程池
线程池可以复用线程,避免频繁创建和销毁线程的开销。ExecutorService
是线程池的核心接口,通过 Executors
工厂类创建。
public class Demo5 {
public static void main(String[] args) {
// 创建带有 5 个线程的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread() + " is running...");
}
});
}
// 销毁线程池
threadPool.shutdown();
}
}
线程池是高并发场景下的推荐方式,可以有效提升性能。
六、定时器 (java.util.Timer
)
Timer
可以用于执行定时任务,支持延迟执行和周期执行。
public class Demo6 {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("定时任务延迟0(即立刻执行), 每隔2000ms执行一次");
}
}, 0, 2000);
}
}
这种方式适用于需要定时执行任务的场景。
七、使用 Lambda 表达式的并行流 (parallelStream
)
Java 8 引入了 Lambda 表达式和并行流,可以简化多线程代码的编写。
import java.util.List;
import com.google.common.collect.Lists;
public class Demo7 {
public static void main(String[] args) {
List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6);
Demo7 demo = new Demo7();
int result = demo.add(list);
System.out.println("计算后的结果为:" + result);
}
public int add(List<Integer> list) {
// 使用 parallelStream 实现并行计算
list.parallelStream().forEach(System.out::println);
return list.parallelStream().mapToInt(i -> i).sum();
}
}
这种方式适用于对集合进行并行操作的场景,代码简洁且易于理解。
评论一下吧
取消回复