Java多线程是Java编程中的一个重要特性,它允许程序同时执行多个任务。这不仅可以提高程序的执行效率,还能更好地利用现代多核处理器的计算能力。在Java中,创建多线程主要有以下几种方式:
1. 继承Thread类
通过继承java.lang.Thread类并重写其run()方法,可以创建新的线程。然后,可以创建该类的实例并调用其start()方法来启动新线程。
class MyThread extends Thread {
public void run() {
System.out.println("Thread running");
}
public static void main(String[] args) {
MyThread t = new MyThread();
t.start(); // 启动线程
}
}
2. 实现Runnable接口
实现java.lang.Runnable接口并实现其run()方法,然后将该实现类的实例传递给Thread类的构造器来创建线程。这种方式比继承Thread类更灵活,因为Java不支持多重继承,但可以实现多个接口。
class MyRunnable implements Runnable {
public void run() {
System.out.println("Thread running");
}
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start(); // 启动线程
}
}
3. 使用Callable和Future
Callable接口类似于Runnable,但它可以返回一个结果,并且可以声明抛出的异常。Future用于表示异步计算的结果,它提供了检查计算是否完成、等待计算完成以及检索计算结果的方法。FutureTask是Future的一个实现,同时实现了Runnable接口,因此可以作为Thread的目标来执行。
import java.util.concurrent.*;
class MyCallable implements Callable<Integer> {
public Integer call() throws Exception {
return 123;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> future = executor.submit(new MyCallable());
System.out.println(future.get()); // 阻塞等待直到计算完成,并返回结果
executor.shutdown();
}
}
4. 使用线程池
线程池(如ExecutorService)是管理一组线程的集合,它提供了控制并发数量的能力,并且可以有效地重用线程,从而减少线程创建和销毁的开销。
ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown(); // 不再提交任何任务,关闭线程池
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 等待所有任务完成
注意事项
- 线程安全:多线程环境下,需要确保对共享数据的访问是线程安全的。
- 同步和锁:Java提供了多种同步机制(如
synchronized关键字、ReentrantLock等)来控制多个线程对共享资源的访问。 - 死锁:在多个线程相互等待对方释放锁时可能会发生死锁,需要避免。
- 性能考量:过多的线程会消耗大量的系统资源,并且可能导致上下文切换的开销增加,从而影响性能。需要根据实际情况调整线程的数量。
3万+

被折叠的 条评论
为什么被折叠?



