Java多线程实战场景

前言

在现代软件开发中,多线程编程已经成为一种常见的技术。多线程可以提高程序的并发性和响应性,使得程序能够更好地利用计算资源。Java作为一种强大的编程语言,提供了丰富的多线程支持,使得开发者可以方便地实现多线程的应用。

本文将介绍几个典型的多线程实战场景,并给出相应的代码示例。

场景一:计算密集型任务的并行处理

当面对一些计算密集型的任务时,通过多线程的方式可以提高计算速度。

import java.util.concurrent.*;

public class CalculationTask implements Callable<Integer> {
    private int start;
    private int end;

    public CalculationTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = start; i <= end; i++) {
            sum += i;
        }
        return sum;
    }

    public static void main(String[] args) throws Exception {
        int start = 1;
        int end = 10000;
        int numThreads = 4;

        ExecutorService executor = Executors.newFixedThreadPool(numThreads);
        List<Future<Integer>> futures = new ArrayList<>();

        int step = (end - start + 1) / numThreads;
        for (int i = 0; i < numThreads; i++) {
            int from = start + i * step;
            int to = (i == numThreads - 1) ? end : start + (i + 1) * step - 1;
            CalculationTask task = new CalculationTask(from, to);
            futures.add(executor.submit(task));
        }

        int totalSum = 0;
        for (Future<Integer> future : futures) {
            totalSum += future.get();
        }

        System.out.println("Total sum: " + totalSum);

        executor.shutdown();
    }
}

在这个示例中,我们将一个大任务划分为若干个小任务,每个小任务由一个线程来处理。通过ExecutorServiceFuture,我们可以方便地管理线程池和获取计算结果。

场景二:并发读写共享资源

当多个线程需要读取或修改同一个共享资源时,需要进行并发控制,以避免数据不一致的问题。

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class SharedResource {
    private int count;
    private ReentrantReadWriteLock lock;

    public SharedResource() {
        count = 0;
        lock = new ReentrantReadWriteLock();
    }

    public int getCount() {
        lock.readLock().lock();
        try {
            return count;
        } finally {
            lock.readLock().unlock();
        }
    }

    public void incrementCount() {
        lock.writeLock().lock();
        try {
            count++;
        } finally {
            lock.writeLock().unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SharedResource resource = new SharedResource();

        Runnable reader = () -> {
            for (int i = 0; i < 1000; i++) {
                int count = resource.getCount();
                System.out.println("Reader " + Thread.currentThread().getId() + " read count: " + count);
            }
        };

        Runnable writer = () -> {
            for (int i = 0; i < 1000; i++) {
                resource.incrementCount();
                System.out.println("Writer " + Thread.currentThread().getId() + " increment count");
            }
        };

        ExecutorService executor = Executors.newFixedThreadPool(4);
        executor.execute(reader);
        executor.execute(reader);
        executor.execute(writer);

        executor.shutdown();
        executor.awaitTermination(1, TimeUnit.MINUTES);
    }
}

在这个示例中,我们使用了ReentrantReadWriteLock来实现读写锁。读操作使用读锁进行并发控制,写操作使用写锁进行排他控制。通过合理地使用读写锁,可以实现高效且线程安全的共享资源访问。

场景三:生产者消费者模式

生产者消费者模式是一种常见的多线程设计模式,用于解决生产者和消费者之间的数据交换问题。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ProducerConsumer {
    private BlockingQueue<Integer> queue;

    public ProducerConsumer(int capacity) {
        queue = new ArrayBlocking