在Java中,两个线程交替执行的方法主要有两种:使用wait()
和notify()
方法,以及使用Semaphore
信号量,下面分别对这两种方法进行详细介绍。
1. 使用wait()和notify()方法
wait()
和notify()
方法是Java内置的线程同步机制,它们位于java.lang.Object
类中,当一个线程需要等待另一个线程完成某个操作时,可以使用wait()
方法进入等待状态,而另一个线程则可以通过调用notify()
或notifyAll()
方法来唤醒等待的线程。
下面是一个简单的示例,展示了如何使用wait()
和notify()
方法实现两个线程交替执行:
public class AlternateThreads { private final Object lock = new Object(); private boolean isThread1Running = true; public void thread1() { synchronized (lock) { while (!isThread1Running) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Thread 1 is running"); isThread1Running = false; lock.notify(); } } public void thread2() { synchronized (lock) { while (isThread1Running) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Thread 2 is running"); isThread1Running = true; lock.notify(); } } public static void main(String[] args) { AlternateThreads alternateThreads = new AlternateThreads(); new Thread(alternateThreads::thread1).start(); new Thread(alternateThreads::thread2).start(); } }
在这个示例中,我们创建了一个名为AlternateThreads
的类,其中包含两个方法thread1()
和thread2()
,分别表示两个线程,这两个方法都使用了synchronized
关键字来确保在同一时刻只有一个线程可以访问共享资源(即lock
对象),我们还定义了一个布尔变量isThread1Running
来表示当前应该运行哪个线程,当一个线程运行时,它会将该变量设置为相应的值,并唤醒等待的线程,这样,两个线程就可以交替执行了。
2. 使用Semaphore信号量
除了使用wait()
和notify()
方法外,我们还可以使用Java并发库中的Semaphore
类来实现两个线程的交替执行。Semaphore
是一个计数信号量,可以用来控制同时访问特定资源的线程数量,我们可以创建一个具有两个许可证的信号量,然后让两个线程按照顺序获取许可证来交替执行。
下面是一个简单的示例,展示了如何使用Semaphore
实现两个线程的交替执行:
import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class AlternateThreadsWithSemaphore { private final Semaphore semaphore = new Semaphore(2); // 创建一个具有两个许可证的信号量 private boolean isThread1Running = true; public void thread1() { try { semaphore.acquire(); // 获取许可证,如果许可证不足则阻塞等待 System.out.println("Thread 1 is running"); isThread1Running = false; semaphore.release(); // 释放许可证,允许其他线程获取许可证 } catch (InterruptedException e) { e.printStackTrace(); } } public void thread2() { try { semaphore.acquire(); // 获取许可证,如果许可证不足则阻塞等待 System.out.println("Thread 2 is running"); isThread1Running = true; semaphore.release(); // 释放许可证,允许其他线程获取许可证 } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { AlternateThreadsWithSemaphore alternateThreadsWithSemaphore = new AlternateThreadsWithSemaphore(); new Thread(alternateThreadsWithSemaphore::thread1).start(); new Thread(alternateThreadsWithSemaphore::thread2).start(); } }
在这个示例中,我们创建了一个名为AlternateThreadsWithSemaphore
的类,其中包含两个方法thread1()
和thread2()
,分别表示两个线程,这两个方法都使用了信号量的acquire()
和release()
方法来获取和释放许可证,当一个线程运行时,它会先获取许可证,然后执行任务,最后释放许可证,这样,两个线程就可以按照顺序交替执行了。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/204318.html