多线程基础概念
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。Java提供了强大的多线程支持,使程序能够并发执行。
创建线程的方式
继承Thread类
public class MyThread extends Thread { @Override public void run() { for(int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + ": " + i); try { Thread.sleep(1000); // 线程休眠1秒 } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); thread1.start(); // 启动线程 thread2.start(); } }
实现Runnable接口
public class MyRunnable implements Runnable { @Override public void run() { for(int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + ": " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { Thread thread1 = new Thread(new MyRunnable(), "Thread-1"); Thread thread2 = new Thread(new MyRunnable(), "Thread-2"); thread1.start(); thread2.start(); } }
线程同步
当多个线程访问共享资源时,可能会出现数据不一致的问题,需要通过同步机制来解决。
synchronized关键字
public class SynchronizedExample { private int count = 0; // 同步方法 public synchronized void increment() { count++; } // 同步代码块 public void decrement() { synchronized(this) { count--; } } public int getCount() { return count; } }
线程池
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。
使用ExecutorService
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { // 创建固定大小的线程池 ExecutorService executor = Executors.newFixedThreadPool(3); // 提交任务 for(int i = 0; i < 5; i++) { final int taskId = i; executor.submit(() -> { System.out.println("任务 " + taskId + " 正在执行,线程: " + Thread.currentThread().getName()); try { Thread.sleep(2000); // 模拟任务执行 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("任务 " + taskId + " 执行完成"); }); } // 关闭线程池 executor.shutdown(); } }
并发工具类
Java提供了丰富的并发工具类来简化多线程编程。
CountDownLatch
import java.util.concurrent.CountDownLatch; public class CountDownLatchExample { public static void main(String[] args) throws InterruptedException { int threadCount = 3; CountDownLatch latch = new CountDownLatch(threadCount); for(int i = 0; i < threadCount; i++) { final int taskId = i; new Thread(() -> { System.out.println("任务 " + taskId + " 完成"); latch.countDown(); // 计数器减1 }).start(); } latch.await(); // 等待所有任务完成 System.out.println("所有任务已完成"); } }