Java 多线程连续打印ABC

5人阅读 评论(0) 收藏 举报
分类:

1. 利用synchronized

思路: 

打印A时,必须先拿到 B,C锁, 打印完了之后,释放A锁,然后打印B的线程拿到A锁后就可以打印B,依次循环。

public class MythreadPrinter implements Runnable {
    private String name;
    private Object prev;
    private Object self;


    @Override
    public void run() {
        int count = 3;
        while (count>0){
            synchronized (prev){
                synchronized (self){
                    System.out.println(name);
                    count--;
                    self.notify();
                }
                try {
                    prev.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws Exception{
        Object a = new Object();
        Object b = new Object();
        MythreaPrinter pa = new MythreaPrinter("A",b,a);
        MythreaPrinter pb = new MythreaPrinter("B",a,b);

        new Thread(pa).start();
        Thread.sleep(100);
        new Thread(pb).start();
        Thread.sleep(100);
    }
}

2.利用lock

public class MythreadPrinter_lock {
    private Lock lock = new ReentrantLock();

    private Condition conditionA = lock.newCondition();
    private Condition conditionB = lock.newCondition();
    private Condition conditionC = lock.newCondition();

    public String cur_name = "A";
    public static void main(String[] args) {
        MythreadPrinter_lock myPrinter = new MythreadPrinter_lock();

        ExecutorService es = Executors.newFixedThreadPool(3);
        es.submit(myPrinter.new PrinterA());
        es.submit(myPrinter.new PrinterB());
        es.submit(myPrinter.new PrinterC());
        es.shutdown();
    }


    public class PrinterA implements Runnable{
        @Override
        public void run() {
            for (int i = 1; i <= 5; i++) {
                lock.lock();
                try {
                    while(cur_name != "A"){
                        try {
                            conditionA.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("第"+i+"次打印"+cur_name);
                    cur_name = "B";
                    conditionB.signal();
                }catch (Exception e){

                }finally {
                    lock.unlock();
                }
            }
        }
    }
    public class PrinterB implements Runnable{
        @Override
        public void run() {
            for (int i = 1; i <= 5; i++) {
                lock.lock();
                try {
                    while(cur_name != "B"){
                        try {
                            conditionB.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("第"+i+"次打印"+cur_name);
                    cur_name = "C";
                    conditionC.signal();
                }catch (Exception e){

                }finally {
                    lock.unlock();
                }
            }
        }
    }
    public class PrinterC implements Runnable{
        @Override
        public void run() {
            for (int i = 1; i <= 5; i++) {
                lock.lock();
                try {
                    while(cur_name != "C"){
                        try {
                            conditionC.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("第"+i+"次打印"+cur_name);
                    cur_name = "A";
                    conditionA.signal();
                }catch (Exception e){

                }finally {
                    lock.unlock();
                }
            }
        }
    }
}

查看评论

JAVA三个线程依次打印ABC

一、一些简单概述        多线程情形下对共享资源的访问是需要互斥的,比如对一个变量的读写,一个线程读写这个变量的时候,其它线程就不能对这个变量进行读写。Java提供了synchronized关...
  • GAMEloft9
  • GAMEloft9
  • 2016-07-07 15:29:31
  • 1344

Java多线程 循环打印ABC 10次

问题描述Java多线程,循环打印”ABC”10次。代码public class printABC { private static int state = 0; public static...
  • Yano_nankai
  • Yano_nankai
  • 2015-10-07 15:12:03
  • 1009

java多线程---顺序打印ABC的三种实现---synchronized方式

利用同步锁,这种方式存在问题就是唤醒的过程中不能指定我说需要唤醒的线程,导致同一个锁上的线程都唤醒了 代码如下: package com.zcj.thread; import java.util.c...
  • whu_zcj
  • whu_zcj
  • 2016-05-27 16:52:19
  • 2384

多线程交替打印ABC的多种实现方法

一、题目描述建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。二、Sync...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2017-08-17 16:43:12
  • 8806

顺序打印ABC------java多线程的一道经典面试题

这是迅雷的一道面试题,顺序打印ABC十次。 源代码如下 public class PrintABC { public static Boolean isThreadA = true; pub...
  • shinehuaking2011
  • shinehuaking2011
  • 2012-10-25 18:59:48
  • 9074

java多线程顺序打印ABC

在JAVA中,是没有类似于PV操作、进程互斥等相关的方法的。JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的...
  • qingjiaoforever
  • qingjiaoforever
  • 2014-10-22 16:24:17
  • 2032

java多线程---顺序打印ABC的三种实现---join方法

使用join方法,让三个线程之间存在等待关系 代码如下: package com.zcj.join; public class JoinTest { public static void m...
  • whu_zcj
  • whu_zcj
  • 2016-05-31 15:37:06
  • 1484

JAVA多线程打印ABC

多线程中一个很有名的例题就是多线程打印ABC,要求用三个线程,分别是打印A,打印B,打印C,轮流唤醒和锁死,最终打印出10组ABC。 /** * Created by 123 on 2016/...
  • sunny1996
  • sunny1996
  • 2016-08-31 21:53:28
  • 231

java多线程---顺序打印ABC的三种实现---ReentrantLock方式

使用jdk1.5并发包中引入的lock方式,这种方式使用比synchronized这种方式更加灵活,也提供了在获取锁时阻塞的办法 代码如下: package com.zcj.thread; impo...
  • whu_zcj
  • whu_zcj
  • 2016-05-27 16:55:49
  • 695

java多线程每个线程挨着打印ABC的4种实现方式

  • 2017年08月23日 16:52
  • 5KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 1012
    积分: 661
    排名: 7万+
    文章存档
    最新评论