Java让两个线程轮流执行
在Java中,多线程编程是一种常见的技术,它允许程序在同时执行多个任务。在某些情况下,我们希望两个线程能够交替执行,也就是说一个线程执行完毕后,另一个线程再开始执行。本文将介绍如何使用Java实现这一功能。
什么是多线程
多线程是指程序同时执行多个任务的能力。在单线程模式下,程序按照顺序执行,一次只能处理一个任务。而在多线程模式下,多个任务可以同时执行,提高了程序的效率。
Java中的多线程编程是通过创建Thread类的实例来实现的。每个Thread对象代表一个独立的线程,可以执行一个任务。
实现两个线程交替执行
要实现两个线程的交替执行,我们可以使用Java的wait()
和notify()
方法。wait()
方法使当前线程等待,直到其他线程通过notify()
方法通知它继续执行。
下面是一个示例代码,其中包含一个Task
类,该类实现了一个简单的任务。我们将创建两个线程,并使它们交替执行这个任务。
public class Task implements Runnable {
private final int id;
private final Object lock;
public Task(int id, Object lock) {
this.id = id;
this.lock = lock;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
synchronized (lock) {
while (id != Main.currentId) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Task " + id + " executed.");
Main.currentId = 1 - Main.currentId;
lock.notifyAll();
}
}
}
}
public class Main {
public static int currentId = 0;
public static void main(String[] args) {
Object lock = new Object();
Task task1 = new Task(0, lock);
Task task2 = new Task(1, lock);
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
thread1.start();
thread2.start();
}
}
在上面的代码中,我们定义了一个Task
类,它实现了Runnable
接口。Task
类有两个重要的属性:id
和lock
。id
表示任务的编号,lock
是一个用于同步的对象。
在run()
方法中,我们使用synchronized
关键字对lock
对象进行同步。这意味着每个线程在进入synchronized
代码块之前必须获得lock
对象的锁。
在每次循环中,线程首先检查id
是否与当前线程的id
匹配。如果不匹配,线程将调用wait()
方法进入等待状态,直到被其他线程通过notify()
方法唤醒。
当线程的id
匹配当前线程的id
时,线程执行任务并打印输出。
之后,我们通过notifyAll()
方法通知其他线程继续执行。然后,循环继续,直到任务完成。
在主方法中,我们创建了两个Task
对象,并将它们分别传递给两个Thread
对象。然后,我们启动这两个线程。
运行以上代码,输出如下:
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
Task 0 executed.
Task 1 executed.
可以看到,两个线程交替执行了任务。
总结
使用Java实现两个线程的交替执行可以通过synchronized
关键字以及wait()
和notify()
方法来实现。助于提高程序的并发性和效率。
在多线程编程中,需要特别注意线程之间的同步问题,以避免出现不可预