多线程1

本文介绍了一个Java多线程问题,通过创建ABC三个线程,每个线程打印自己的名字,最终实现ABC交替打印,形成'ABCABC...'的循环。线程间通过共享对象进行通信,利用wait()和notifyAll()方法协调执行顺序,确保打印顺序正确。
摘要由CSDN通过智能技术生成

打印10遍ABCABC

有ABC三个线程,每一个线程打印自己名字,需要打印结果为ABCABC…,打印10遍

循环重复执行的问题

ABC三个线程需要通信,三个线程共用一个对象,自定义一个对象,知道当前是哪个线程执行,下一个通知的执行线程

/**
 * 自定义对象
 */
public class Print {
    private int index;//当前执行的线程编号  0  1  2

    public int getIndex() {
        return index;
    }

    public void setIndex(int i) {
        index = i;
    }
}

public class ABCThread extends Thread {
    private DIYObject object;//线程共享对象,线程间通知也是该对象
    private int threadId;//当前线程编号
    /**
     * 三个线程命名为ABC
     * 传递的线程ID为int类型的数据
     * name数组下标  0 1 2 分别 A B C
     * name[0] = 'A'
     * 线程循环使用(threadId+1)% 3
     * threadId=0当前(0+1)%3=1    即下一个执行threadID=1  name[1] = b
     * threadId=1d (1+1)%3 =2     即threadID = 2        name[2] = c
     * threadId =2  (2+1)%3 = 0   即threadID= 0        name[0]=A
     *
     */
    private String name[] = {"A","B","C"};

    public ABCThread(DIYObject o,int id) {
        this.object = o;
        this.threadId = id;
    }

    @Override
    public void run() {
         int num = 10;
         while (num-- > 0) {
             synchronized (object) {
                 //先判断通知的是否是当前线程
                 while (!(threadId == object.getIndex())) {
                     //循环判断是否当前的线程执行,执行条件:
                     // 当先线程threadID和即将执行的线程DIYObject.getIndex()相同
                     try {
                         object.wait();
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }
                 //执行
                 System.out.print(name[threadId]+" ");

                 //执行下一个执行的线程ID
                 object.setIndex((threadId+1)%3);

                 //通过之其他的两个线程
                 object.notifyAll();
             }
         }
    }

    public static void main(String[] args) {
        DIYObject diyObject = new DIYObject();
        new ABCThread(diyObject,0).start();
        new ABCThread(diyObject,1).start();
        new ABCThread(diyObject,2).start();
        //启动三个线程

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值