博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三个线程ABC,交替打印ABC
阅读量:5030 次
发布时间:2019-06-12

本文共 2263 字,大约阅读时间需要 7 分钟。

转载与:https://www.cnblogs.com/x_wukong/p/4009709.html

 

创建3个线程,让其交替打印ABC 。 输出如下:  ABCABCABCABC。

 

方法:使用synchronized关键字和wait()  、notify()

主要的思想就是,为了控制执行的顺序,必须要先持有a锁,也就是前一个线程要释放自身对象锁,再去申请自身对象锁,两者兼备时打印字母,之后首先调用b.notify()释放自身对象锁,唤醒下一个等待线程,再调用a.wait()释放a对象锁,终止当前线程,等待循环结束后再次被唤醒。程序运行的主要过程就是A线程最先运行,持有C,A对象锁,后释放A,C锁,唤醒B。线程B等待A锁,再申请B锁,后打印B,再释放B,A锁,唤醒C,线程C等待B锁,再申请C锁,后打印C,再释放C,B锁,唤醒A……

为了防止线程A,B,C顺序启动,因此在启动a线程之后要让线程休眠,然后启动线程B,再启动线程C。

 

要注意的是notify()可以将下一个想要获得该锁的线程唤醒。wait()可以释放锁。

package threadforme;public class ThreadWait extends Thread{    private String name;    private Object a;    private Object b;        public ThreadWait(String name,Object a,Object b) {        this.name=name;        this.a=a;        this.b=b;    }    public void run() {            int count=10;            while(count>0) {            synchronized(a) {        //先获得a锁,进入临界区                synchronized(b) {                        count--;                System.out.print(name);                                        b.notify();          //在完成打印之后,将b的阻塞线程唤醒            }                try {                    a.wait();        //调用wait方法终止当前线程                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }            }}}
package threadforme;public class ThreadTest {        public static void main(String[] args) throws InterruptedException {        Object a=new Object();        Object b=new Object();        Object c=new Object();        ThreadWait t1=new ThreadWait("A",c,a);    //先获得C锁,然后对打印A的过程进行锁定,再释放A锁,再释放C锁        ThreadWait t2=new ThreadWait("B",a,b);    //按照顺序获得A锁,获得B锁,打印B        ThreadWait t3=new ThreadWait("C",b,c);        t1.start();        Thread.sleep(20);        t2.start();        Thread.sleep(20);        t3.start();            }}

 

 

package threadforme;

public class ThreadTest {public static void main(String[] args) throws InterruptedException {Object a=new Object();Object b=new Object();Object c=new Object();ThreadWait t1=new ThreadWait("A",c,a);//先获得C锁,然后对打印A的过程进行锁定,再释放A锁,再释放C锁ThreadWait t2=new ThreadWait("B",a,b);//按照顺序获得A锁,获得B锁,打印BThreadWait t3=new ThreadWait("C",b,c);t1.start();t2.start();t3.start();}
}

 

转载于:https://www.cnblogs.com/patatoforsyj/p/9579884.html

你可能感兴趣的文章
ubuntu 16.04 (软件应用)-输入法
查看>>
windos7修复引导扇区
查看>>
Leetcode总结之Backtracking
查看>>
Android开发学习之路-图片颜色获取器开发(1)
查看>>
StackExchange.Redis 官方文档(一) Basics
查看>>
nupkg 之破解 nodejs+electron-packager 打包exe的解包
查看>>
Objective-C 使用 C++类
查看>>
浅谈之高级查询over(partition by)
查看>>
Notes: CRM Analytics–BI from a CRM perspective (2)
查看>>
graphite custom functions
查看>>
列出所有的属性键
查看>>
js获取请求地址后面带的参数
查看>>
[原创]使用java批量修改文件编码(ANSI-->UTF-8)
查看>>
设计模式のCompositePattern(组合模式)----结构模式
查看>>
二进制集合枚举子集
查看>>
磁盘管理
查看>>
SAS学习经验总结分享:篇二—input语句
查看>>
UIImage与UIColor互转
查看>>
RotateAnimation详解
查看>>
系统管理玩玩Windows Azure
查看>>