Java多线程编程练习题

1. 引言

多线程编程是指在同一个程序中同时运行多个线程,以提高程序的并发性和响应性。Java提供了丰富的多线程编程支持,使得开发者能够轻松地创建和管理多个线程。本文将介绍一些常见的Java多线程编程练习题,并给出相应的代码示例。

2. 基本概念

在开始解答练习题之前,我们先来了解一些Java多线程编程的基本概念。

2.1 线程

线程是计算机中最小的执行单元,是程序执行的一条执行路径。一个进程可以包含多个线程,每个线程都有自己的执行序列。

在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。具体代码如下:

// 继承Thread类
public class MyThread extends Thread {
    public void run() {
        // 线程执行的代码
    }
}

// 实现Runnable接口
public class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的代码
    }
}

2.2 同步

多个线程访问共享资源时,可能会发生冲突的情况。为了避免这种冲突,需要使用同步机制。Java提供了synchronized关键字和Lock接口来实现同步。

下面是使用synchronized关键字进行同步的示例代码:

public class MyThread extends Thread {
    private static int count = 0;

    public synchronized void increment() {
        count++;
    }

    public void run() {
        for (int i = 0; i < 1000; i++) {
            increment();
        }
    }
}

2.3 线程通信

多个线程之间需要进行通信,以便协调各个线程的执行。Java提供了wait()notify()notifyAll()方法来实现线程之间的通信。

下面是使用wait()notify()方法进行线程通信的示例代码:

public class Message {
    private String value;

    public synchronized String getValue() {
        while (value == null) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        String message = value;
        value = null;
        notify();
        return message;
    }

    public synchronized void setValue(String value) {
        while (this.value != null) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.value = value;
        notify();
    }
}

3. 练习题

3.1 使用多线程计算斐波那契数列

斐波那契数列是指从第三项开始,每一项是前两项的和。编写一个多线程程序,在不同的线程中计算斐波那契数列的不同项。

下面是计算斐波那契数列的示例代码:

public class FibonacciThread extends Thread {
    private int n;
    private int result;

    public FibonacciThread(int n) {
        this.n = n;
    }

    public int getResult() {
        return result;
    }

    public void run() {
        if (n == 0) {
            result = 0;
        } else if (n == 1) {
            result = 1;
        } else {
            int a = 0;
            int b = 1;
            for (int i = 2; i <= n; i++) {
                int temp = a + b;
                a = b;
                b = temp;
            }
            result = b;
        }
    }
}

3.2 使用多线程实现生产者-消费者模型

生产者-消费者模型是指多个生产者线程和多个消费者线程共享一个缓冲区,在生产者线程将数据写入缓冲区后,消费者线程可以从缓冲区中读取数据。

下面是实现生产者-消费者模型的示例代码:

public class Buffer {
    private int size;
    private List<Integer> buffer;

    public Buffer(int size)