java多线程打印ABC

/**
 * 方案一
 *
 * @author LY
 */
public class LockObject {

    public String lockName;

    public LockObject() {
    }

    public LockObject(String lockName) {
        this.lockName = lockName;
    }

    public String getLockName() {
        return lockName;
    }

    public void setLockName(String lockName) {
        this.lockName = lockName;
    }

}

public class MyThread implements Runnable {

    private String name;
    private String next;
    private LockObject lock;

    MyThread(String name, String next, LockObject lock) {
        this.name = name;
        this.next = next;
        this.lock = lock;
    }

    /**
     * 三个线程同时启动:
     * 1.new Thread(new MyThread("A", "B", data)).start();
     * 2.new Thread(new MyThread("B", "C", data)).start();
     * 3.new Thread(new MyThread("C", "A", data)).start();
     * 同时进入循环:
     * 前面Data data = new Data("A");
     * 所以data=A
     * 第一个线程满足条件,进入同步方法:打印A,设置data=B,count=2
     * 第二个线程不满足条件,进入无限循环,count=3
     * 第三个线程不满足条件,进入无限循环,count=3
     * data=B
     * 第二个线程满足条件,进入同步方法:打印B,设置data=C,count=2
     * 第一个线程不满足条件,进入无限循环,count=2
     * 第三个线程不满足条件,进入无限循环,count=3
     * data=C
     * 第三个线程满足条件,进入同步方法:打印C,设置data=A,count=2
     * 第一个线程不满足条件,进入无限循环,count=2
     * 第二个线程不满足条件,进入无限循环,count=2
     *
     * 当再次data=A
     * 从第一个线程开始,三个线程依次符合条件再跑一次,count=1
     *
     * 打印结果:ABCABCABC
     */
    public void run() {
        int count = 3;
        while (count > 0) {
            if (lock.getLockName().equals(name)){
                synchronized (lock) {
                    System.out.print(name);
                    lock.setLockName(next);
                    count--;
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        LockObject data = new LockObject("A");
        new Thread(new MyThread("A", "B", data)).start();
        new Thread(new MyThread("B", "C", data)).start();
        new Thread(new MyThread("C", "A", data)).start();
    }

}
时间: 2024-11-17 06:02:34

java多线程打印ABC的相关文章

[******] java多线程连续打印abc

题目描述 建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 5种方法 使用synchronized, wait和notifyAll 使用Lock->ReentrantLock 和 state标志 使用Lock->ReentrantLock 和Condition(await .signal.signalAll) 使用Semaphore 使用AtomicInteger 扩

Java多线程循环打印ABC的5种实现方法

题目:3个线程循环打印ABC,其中A打印3次,B打印2次,C打印1次,循环打印2轮一.Synchronized同步法思路:使用synchronized.wait.notifyAll的方法利用线程标记变量控制三个线程的执行顺序. /** * @author XDarker * 2018-5-17 */public class Main { public static void main(String[] args) throws InterruptedException { int num = 1

JAVA 多线程开篇 -从按顺序打印ABC开始

序言 很想把一个问题弄清楚,特别是以前一直模模糊糊的并发编程,今天在华为OJ上碰到一道题,“顺序打印ABC的两种方法开始写起”,就以这道题开篇,希望日后有时间把并发编程的基本问题弄清楚. 问题 启动三个线程,一个线程打印A,一个打印B,一个打印C,按顺序打印ABC.....如输入3,输出就是“ABCABCABC” 程序 线程的调度是由系统操作的,要想多个线程按照要求顺序打印,就必须做好线程间的同步. 思路:四个线程循环打印,但是一个线程打印一个字母释放锁后无法确定获得锁的是哪一个线程,这就需要用

python 多线程实现循环打印 abc

python 多线程实现循环打印 abc 好久没写过python了, 想自己实践一下把 非阻塞版 import threading import time def print_a(): global value global lock global stop_flag while stop_flag: while True: if value == 0 or value == 3: break lock.acquire() value = 1 time.sleep(1) print("aaa&q

多线程练习--顺序打印ABC十次

这是迅雷的一道面试题,顺序打印ABC十次. public class TenABC { public static void main(String[] args) { final BlockingQueue queue = new ArrayBlockingQueue(30); for (int i = 0; i < 10; i++) { try { queue.put("A"); queue.put("B"); queue.put("C"

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

Java多线程学习

写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线

Java多线程学习(吐血超具体总结)

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文仅仅能说是java多线程的一个入门.事实上Java里头线程全然能够写一本书了,可是假设最基本的你都学掌握好,又怎么能更上一个台阶呢?假设你认为此文非常简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 文件夹(?)[-] 一扩展ja