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类有两个重要的属性:idlockid表示任务的编号,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()方法来实现。助于提高程序的并发性和效率。

在多线程编程中,需要特别注意线程之间的同步问题,以避免出现不可预