Java多线程经典习题
引言
多线程是计算机科学中一个重要的概念。它允许程序同时执行多个任务,从而提高了计算机系统的效率。在Java中,多线程的实现非常简单,使用Thread类或者实现Runnable接口就可以实现多线程的功能。然而,对于初学者来说,理解和掌握多线程的概念和使用方法并不容易。本文将介绍一些经典的Java多线程习题,帮助读者更好地理解和掌握多线程的使用。
习题1:创建线程
问题描述: 编写一个Java程序,创建一个线程,使其输出从1到10的数字。
解决方案: 可以通过继承Thread类来创建一个线程,重写run()方法实现线程的具体逻辑。下面是一个示例代码:
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
在这个例子中,创建了一个名为MyThread的类,继承自Thread类,并重写了run()方法。在run()方法中,使用for循环输出数字1到10。在Main类的main()方法中,创建了一个MyThread对象并调用start()方法启动线程。
运行上述代码,可以看到输出结果是从1到10的数字。
习题2:线程同步
问题描述: 编写一个Java程序,创建两个线程,一个线程输出奇数,另一个线程输出偶数,要求两个线程交替输出。
解决方案: 为了实现两个线程的交替输出,可以使用对象锁来控制线程的执行顺序。下面是一个示例代码:
public class NumberPrinter {
private int number = 1;
public synchronized void printOdd() {
while (number <= 10) {
if (number % 2 != 0) {
System.out.println("Odd: " + number);
number++;
notify();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public synchronized void printEven() {
while (number <= 10) {
if (number % 2 == 0) {
System.out.println("Even: " + number);
number++;
notify();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class OddThread extends Thread {
private NumberPrinter printer;
public OddThread(NumberPrinter printer) {
this.printer = printer;
}
@Override
public void run() {
printer.printOdd();
}
}
public class EvenThread extends Thread {
private NumberPrinter printer;
public EvenThread(NumberPrinter printer) {
this.printer = printer;
}
@Override
public void run() {
printer.printEven();
}
}
public class Main {
public static void main(String[] args) {
NumberPrinter printer = new NumberPrinter();
OddThread oddThread = new OddThread(printer);
EvenThread evenThread = new EvenThread(printer);
oddThread.start();
evenThread.start();
}
}
在这个例子中,创建了一个名为NumberPrinter的类,用于打印数字。NumberPrinter类中有两个同步方法printOdd()和printEven(),分别用于打印奇数和偶数。在每个方法中,使用while循环进行输出,并使用wait()和notify()方法来控制线程的执行顺序。
在Main类的main()方法中,创建了一个NumberPrinter对象和两个线程对象(OddThread和EvenThread),然后分别调用start()方法启动线程。
运行上述代码,可以看到输出结果是奇数和偶数交替输出的。
习题3:线程池
问题描述: 编写一个Java程序,使用线程池来计算1到100的和。
解决方案: 使用线程池可以有效管理线程的创建和销毁,提高程序的性能和效率。