本文共 3144 字,大约阅读时间需要 10 分钟。
在学习Java多线程编程时,资源共享和多线程安全是非常重要的内容。为了更好地理解,我设计了一个多线程程序,按照顺序启动三个线程AA、BB、CC,它们分别打印5次、10次和15次字符。这个程序需要确保线程之间的资源共享是安全且有序的。
为了实现线程间的资源共享,我使用了ReentrantLock和Condition类。ReentrantLock允许同一线程多次获取锁,其他线程需要等待。而Condition则用于线程间的通知和等待,确保线程能够有序地执行任务。
我为每个线程设计了一个操作方法,分别是print5、print10和print15。每个方法都在获取锁后检查当前的状态,确保线程能够安全地执行任务。
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class ShareResource { private int number = 1; // 1:A, 2:B, 3:C private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); public void print5() { lock.lock(); try { while (number != 1) { condition1.await(); } for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "\tA"); } number = 2; condition2.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void print10() { lock.lock(); try { while (number != 2) { condition2.await(); } for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "\tB"); } number = 3; condition3.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void print15() { lock.lock(); try { while (number != 3) { condition3.await(); } for (int i = 0; i < 15; i++) { System.out.println(Thread.currentThread().getName() + "\tC"); } number = 1; condition1.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }}public class ThreadOrderAccess { public static void main(String[] args) { ShareResource shareResource = new ShareResource(); new Thread(() -> { for (int i = 0; i < 10; i++) { shareResource.print5(); } }, "thread1").start(); new Thread(() -> { for (int i = 0; i < 10; i++) { shareResource.print10(); } }, "thread2").start(); new Thread(() -> { for (int i = 0; i < 10; i++) { shareResource.print15(); } }, "thread3").start(); }} number变量跟踪当前状态,确保线程按照正确的顺序执行任务。为了确保程序的正确性,可以运行代码观察输出结果。预期输出应该是:
thread1 A 5次thread2 B 10次thread3 C 15次thread1 A 5次thread2 B 10次thread3 C 15次
通过观察输出,可以确认线程按照预期的顺序执行任务。
转载地址:http://ajco.baihongyu.com/