(多线程) Thread类; Runnable接口; Callable接口; 线程的安全问题(小明和小红在银行取钱)。 请大家编写课堂上的多线程类代码,写入Word中,写清题意,代码和结果截图即可。
时间: 2024-09-14 15:10:05 浏览: 46
Java多线程-创建多线程的基本方式二:实现Runnable接口
多线程是计算机程序设计中的一个概念,指的是一个程序内可以同时运行多个线程执行不同的任务。在Java中,多线程的实现主要有以下几种方式:
1. Thread类:这是Java中用于多线程编程的核心类之一。通过继承Thread类,并重写其run方法,可以创建一个新的线程。然后,通过调用线程对象的start方法来启动线程。
2. Runnable接口:这是一种更灵活的方法。通过实现Runnable接口,并重写其run方法,可以定义一个线程的任务内容。然后,创建一个Thread类的实例,并将实现了Runnable接口的对象作为构造参数传递给这个Thread实例。最后,通过Thread对象的start方法来启动线程。
3. Callable接口:这是Java 5引入的一个接口,类似于Runnable,但它允许线程返回一个结果。Callable接口可以返回带有泛型的结果,并可以抛出异常。通常与ExecutorService一起使用来执行Callable任务,并返回Future对象用于获取结果。
关于线程安全问题,这是一个在多线程环境中经常遇到的问题,指的是多个线程访问和修改共享数据时,如何保证数据的一致性和完整性。举例来说,如果有两个线程小明和小红同时在银行取款,而且他们取的金额加上当前余额应该不超过账户的总额,如果这个过程中没有适当的同步措施,就可能出现超支的情况。
下面是一个简单的示例代码,展示了如何使用Runnable接口在Java中实现多线程:
```java
public class BankAccount {
private int balance = 1000;
public synchronized void withdraw(int amount) {
if (amount > balance) {
throw new RuntimeException("Insufficient funds");
}
balance -= amount;
System.out.println(Thread.currentThread().getName() + " withdrew: " + amount);
System.out.println("Balance left: " + balance);
}
}
class WithdrawThread implements Runnable {
private BankAccount account;
private int amount;
public WithdrawThread(BankAccount account, int amount) {
this.account = account;
this.amount = amount;
}
@Override
public void run() {
account.withdraw(amount);
}
}
public class MultiThreadingExample {
public static void main(String[] args) {
BankAccount account = new BankAccount();
WithdrawThread t1 = new WithdrawThread(account, 300);
WithdrawThread t2 = new WithdrawThread(account, 800);
Thread thread1 = new Thread(t1, "Thread-1");
Thread thread2 = new Thread(t2, "Thread-2");
thread1.start();
thread2.start();
}
}
```
这段代码中,`BankAccount` 类中的 `withdraw` 方法是同步的,这样可以避免同时取款时的数据竞争问题。`WithdrawThread` 类实现了 `Runnable` 接口,并在其 `run` 方法中调用了 `withdraw` 方法。在 `MultiThreadingExample` 类的 `main` 方法中,创建了两个线程对象,并启动它们。
由于CSDN的“C知道”服务不支持生成Word文档或截图,您需要将上述代码复制到您的Java开发环境中,执行并观察结果。如果需要将代码和结果截图到Word文档中,请在您的本地环境中执行上述操作,并使用截图工具捕获结果。
阅读全文