Java之【线程通信】--标志位练习2

定义一个线程A,输出1 ~ 10之间的整数,定义一个线程B,逆序输出1 ~ 10之间的整数,要求线程A和线程B交替输出

方法一:非标志位方法

package Homework;
//1  定义一个线程A,输出1 ~ 10之间的整数,定义一个线程B,逆序输出1 ~ 10之间的整数,要求线程A和线程B交替输出
public class Test1 {
    public static void main(String[] args){
        Object obj=new Object();
        A a=new A(obj);
        B b=new B(obj);
        a.start();
        b.start();
    }

}

class A extends Thread{
    Object obj;

    public A() {
        super();
    }

    public A(Object obj) {
        super();
        this.obj = obj;
    }

    //正序打印
    @Override
    public void run() {
        synchronized (obj) {
            for(int i=1;i<11;i++){
                System.out.print(i+",");
                obj.notify();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }

    }
}
class B extends Thread{
    Object obj;
    public B() {
        super();
    }

    public B(Object obj) {
        super();
        this.obj = obj;
    }

    //逆序打印
    @Override
    public void run() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        synchronized (obj) {
            for(int i=10;i>0;i--){
                System.out.print(i+",");
                obj.notify();
                if(i>1){
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }

    }
}

运行结果:
这里写图片描述

方法二:采用标志位

package Homework;
//1  定义一个线程A,输出1 ~ 10之间的整数,定义一个线程B,逆序输出1 ~ 10之间的整数,要求线程A和线程B交替输出
public class Test2 {
    public static void main(String[] args){
        C c=new C();
        A1 a1=new A1(c);
        B1 b1=new B1(c);
        a1.start();
        b1.start();
    }
}
class A1 extends Thread{
    C c;

    public A1(C c) {
        super();
        this.c = c;
    }

    public A1() {
        super();
    }
    @Override
    public void run() {

        synchronized (c) {
            for(int i=1;i<11;i++){
                if(c.flag==true){
                    try {
                        c.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                c.print(i);
                c.flag=true;
                c.notify();
            }
        }

    }

}
class B1 extends Thread{
    C c;

    public B1(C c) {
        super();
        this.c = c;
    }

    public B1() {
        super();
    }
    @Override
    public void run() {
        synchronized (c) {
            for(int i=10;i>0;i--){
                if(c.flag==false){
                    try {
                        c.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                c.print(i);
                c.flag=false;
                c.notify();
            }

        }

    }
}
class C {
    boolean flag=false;//true A已经打印,B为打印 A等待

    public void print(int i){
        System.out.print(i+",");
    }
}

运行结果
这里写图片描述

posted @   TCB_Java  阅读(411)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
点击右上角即可分享
微信分享提示