需求说明:
多线程操作同一个实例变量的操作会引发多线程并发的安全问题。现有 3 个线程代表 3 只猴子,对类中的一个整型变量 count(代表花的总数,共 20 朵花)进行操作。该变量代表花的总数,不同猴子(线程)每采摘一次,花的总数少 1,直至所有花被不同的猴子采摘完,程序结束
实现思路:
项目中创建 Current 类,在 Current 类中,声明静态的 Current 类型引用 current 和 int 类型的实例变量 num,并指定 num 的初始值为 20,代表花的总数
定义采花 fetch() 方法。在方法中使用同步代码块对 current 对象进行加锁。在同步代码块中,判断 num 是否大于 0,如果大于 0,则输出猴子采花的进度,并让 num 自减
重写 run() 方法。在该方法中创建 while 循环,条件为 num 大于 0。循环中调用 fetch(String name) 方法,通过调用 Thread.currentThread().getName() 方法获取当前运行的线程名称,并将该线程名称赋值给参数 name
创建程序入口 main() 方法,在该方法中创建 3 条线程,并分别为这 3 条线程设置名称为“猴子 A”“猴子 B”和“猴子 C”,依次调用 3 个线程对象的 start() 方法,启动线程
实现代码:
public class T1 implements Runnable { // public static T1 t2 = new T1(); //设置鲜花的数量为20 int num = 20; @Override public void run() { synchronized (new T1()) { while (num>0) { System.out.println("猴子"+Thread.currentThread().getName()+"\t菜花\t"+num--); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void main(String[] args) { T1 t1=new T1(); Thread thread = new Thread(t1); Thread thread1 = new Thread(t1); thread1.setName("B"); thread.setName("A"); thread.start(); thread1.start(); } }