Java实现多线程经典问题:使用三个线程实现输出ABCABC循环

使用三个线程实现ABCABC……循环。

代码如下:

//标记类,用来让三个线程共享,同时也是三个线程中同步代码快的标记对象。
//之前这个标记我设置成Integer,但是发现Integer进行加法运算时会改变对
//象引用(原因是自动装箱),因此出现异常抛出。所以索性自己定义Flag类。
class Flag{
    int i=0;
    public synchronized void  setI()
    {
        i++;
        if(i==3)
            i=0;
    }

}
//输出A的线程
class SafeTestA implements Runnable{
    int num=10;
    Flag flag;
    public SafeTestA(Flag flag)
    {
        this.flag=flag;
    }
    public void run()
    {
        synchronized(flag){
            while(true)
            {
                if(flag.i==0){
                    System.out.println("A");
                    flag.setI();
                    flag.notifyAll();
                }else{
                    try {
                        flag.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }

    }
    /*public static void main(String[] args) {
        Runnable sf=new SafeTest();
        new Thread(sf).start();
        new Thread(sf).start();
        new Thread(sf).start();
    }*/
}
//输出B的线程:
class SafeTestB implements Runnable{
    Flag flag;
    public SafeTestB(Flag flag)
    {
        this.flag=flag;
    }
    public void run()
    {
        while(true)
        {
            synchronized(flag){
                while(true)
                {
                    if(flag.i==1){
                        System.out.println("B");
                        flag.setI();
                        flag.notifyAll();
                    }else{
                        try {
                            flag.wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

}

//输出C的线程
public class SafeTestC implements Runnable{
    Flag flag;
    public SafeTestC(Flag flag)
    {
        this.flag=flag;
    }
    public void run()
    {
        synchronized(flag){
            while(true)
            {
                if(flag.i==2){
                    System.out.println("C");
                    flag.setI();
                    flag.notifyAll();
                }else{
                    try {
                        flag.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        Flag flag=new Flag();
        new Thread(new SafeTestA(flag)).start();
        new Thread(new SafeTestB(flag)).start();
        new Thread(new SafeTestC(flag)).start();

    }
}
最关键的问题在于三个线程间的通信问题,是通过flag对象来标记的,之前出错是因为使用Integer来作为标记。这个例子也很好的给出了同步代码块的使用方法。
我的这个代码有累赘的部分,三个线程类其实可以用一个来实现更简洁。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 08:07:43

Java实现多线程经典问题:使用三个线程实现输出ABCABC循环的相关文章

三个线程顺序输出

一.join介绍 Thead.join()函数在使用后,会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行.源码中调用join后,方法会一直检测要join()的线程是否存活(isAlive()方法),直到线程执行完成后,调用线程的this.notifyAll()方法,才会回到刚刚挂起的主程序.基本操作如下: public class Worker extends Thread { // 工作者名 private String name; // 工作时间 private long tim

java的多线程学习,第三记

一,Java内存模型 Java内存模型规定了所有的内存变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来).线程对变量的所有操作(读取,赋值)都必须在工作内存中进行.不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均通过主内存来完成 基于这种模型的多线程就会出现很多问题,多线程的---------脏读数据 举例说明: i=123++; 现在有同时2个线程执行这段代码,加入初始值为123,那么有两个线程正

Java 多线程详解(三)------线程的同步

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程:http://www.cnblogs.com/ysocean/p/6883491.html 介绍完如何创建进程以及线程了,那么我们接着来看一个实例: 利用多线程模拟 3 个窗口卖票 第一种方法:继承 Thread 类 创建窗口类 TicketSell package com.ys.thread; p

iOS开发——多线程OC篇&(三)线程安全

线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 问题代码: 1 // 2 // YYViewController.m 3 // 05-线程安全 4 // 5 // Created by apple on 14-6-23. 6 // Copyright (c) 2014年 itcase. All rights reserved

多线程学习-基础(三)线程的调度

一.线程调度(1)调整线程的优先级Java线程有优先级,优先级高的线程会获得较多的执行机会,但是只是抢占cpu使用权的机会增加了,并不意味着就一定先执行.Java线程的优先级用整数来表示,取值范围为:1~10 ,Thread有以下3个静态常量:static int MAX_PRIORITY线程可以具有最高优先级 取值:10static int MIN_PRIORITY线程可以具有最低优先级,取值:1static int NORM_PRIORITY分配给线程的默认优先级,取值:5 Thread类的

C#多线程编程系列(三)- 线程同步

目录 1.1 简介 1.2 执行基本原子操作 1.3 使用Mutex类 1.4 使用SemaphoreSlim类 1.5 使用AutoResetEvent类 1.6 使用ManualResetEventSlim类 1.7 使用CountDownEvent类 1.8 使用Barrier类 1.9 使用ReaderWriterLockSlim类 1.10 使用SpinWait类 参考书籍 笔者水平有限,如果错误欢迎各位批评指正! 1.1 简介 本章介绍在C#中实现线程同步的几种方法.因为多个线程同时

三个线程同时输出12345 678910 1112131415....以此类推

package thread; public class th { public static int j = 0; public static void main(String[] args) { for (int i = 0; i < 5; i++) { t tt = new t(); tt.start(); th.xun(); System.out.println("线程1"); d dd = new d();  dd.start(); } } public static

Java多线程:用三个线程控制循环输出10次ABC

题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次. 解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程.这里用一个Lock对象来控制三个线程的同步.用一个int型变量state标识由那个线程输出. 1 package com.thread; 2 3 import java.util.concurrent.locks.Lock;

Java 多线程详解(五)------线程的声明周期

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程:http://www.cnblogs.com/ysocean/p/6883491.html Java 多线程详解(三)------线程的同步:http://www.cnblogs.com/ysocean/p/6883729.html Java 多线程详解(四)------生产者和消费者:http:/