`

编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC

 
阅读更多

 

package test1;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * 编写一个程序,开启3个线程,
 * 这3个线程的ID分别为A、B、C,
 * 每个线程将自己的ID在屏幕上打印10遍,
 * 要求输出结果必须按ABC的顺序显示;
 * 如:ABCABC….依次递推
 * 
 * 设计:LOCK+condition(可以把A、B、C理解成主线程,子线程,孙线程)
 * @author Mahone
 *
 */
public class Test3 {
	public static void main(String[] args) {
		Test3 obj = new Test3();
		obj.init();
	}
	
	private void init() {
		final Test3Business tb = new Test3Business();
		
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					tb.printA();
				}
			}
		});
		t1.setName("A");
		
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					tb.printB();
				}
			}
		});
		t2.setName("B");
		
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					tb.printC();
				}
			}
		});
		t3.setName("C");
		
		t1.start();
		t2.start();
		t3.start();
	}
}

class Test3Business {
	
	private String flag = "A";
	
	private Lock lock = new ReentrantLock();
	
	private Condition cA = lock.newCondition();
	private Condition cB = lock.newCondition();
	private Condition cC = lock.newCondition();
	
	public void printA () {
		try {
			lock.lock();
			if (!flag.equals("A")) {
				cA.await();
			}
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(1000);
			flag = "B";
			cB.signal();
		} catch (Exception ex) {
			ex.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
	
	public void printB () {
		try {
			lock.lock();
			if (!flag.equals("B")) {
				cB.await();
			}
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(1000);
			flag = "C";
			cC.signal();
		} catch (Exception ex) {
			ex.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
	
	public void printC () {
		try {
			lock.lock();
			if (!flag.equals("C")) {
				cC.await();
			}
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(1000);
			flag = "A";
			cA.signal();
		} catch (Exception ex) {
			ex.printStackTrace();
		}finally {
			lock.unlock();
		}
	}
}

 

 

分享到:
评论

相关推荐

    多线程和多进程的管理

    1号进程创建2,3号两个进程 2号进程创建两个线程Thread1,Thread2 Thread1:求(1~n)之间的素数 Thread2:生成Fibonacci序列 ...每个进程输出自己的进程ID和父进程的进程ID,观察分析,并画出程序的进程树结构。

    操作系统课程实验.rar

    编写三个不同的程序 cmd1.c,cmd2.c,cmd3.c,每个程序的功能自定,分别编译成可执 行文件 cmd1,cmd2,cmd3。然后再编写一个程序,模拟 shell 程序的功能,能根据用户输 入的字符串(表示相应的命令名),去为相应的...

    linux系统编程之线程.zip

    线程id的类型是thread_t,它只在当前进程中保证是唯一的,在不同的系统中thread_t这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数用printf打印,调用...

    一个进程池的服务器程序

    一个进程池的服务器程序 下面做了非常简单的http服务器,该服务器只能接收Get请求。 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子...

    模拟Ethernet帧的发送过程

    1)、用两个线程a和b来模拟Ethernet上的两台主机。 2)、用一个双字类型变量Bus来模拟总线(将其初始化为” \0”,并且总线等于”\0”时 表示总线空闲)。 3)、两个子线程向总线发送自己的数据。数据用该线程的...

    ATM java程序

    n 每个 ATM有自己的ID、安装位置信息; n 查询余额:初始余额为10000元; n ATM 取款:每次取款金额为100 元的整数倍,当日取款总额不超过5000元,支取 金额不允许透支; n 用户可查询交易明细,包括交易类型(存...

    threadpool:一个用C编写的实现工作窃取和工作帮助的fork联接框架线程池

    每个工作人员都有自己的期货队列以及线程ID。 每个Future都存储任务及其数据,一个条件变量以在完成执行时对其进行标记,其状态以及对其包含的池的引用。 工作线程的流程如下:它首先遇到一个while循环,该循环...

    Android实现网络多线程断点续传下载功能

    多线程下载的原理就是将要下载的文件分成若干份,其中每份都使用一个单独的线程进行下载,这样对于文件的下载速度自然就提高了许多。 既然要分成若干部分分工下载,自然要知道各个线程自己要下载的起始位置,与要...

    Java面试宝典2010版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\...

    最新Java面试宝典pdf版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    JAVA面试题最全集

    请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一...

    Java面试笔试资料大全

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    poca:用Python 3编写的快速,多线程和高度可定制的命令行播客客户端

    波卡是使用Python 3编写的快速,多线程和高度可定制的命令行播客客户端。从1.0开始,已实现所有计划的功能。产品特点最大金额。 指定在删除旧剧集为新剧集腾出空间之前,订阅应获得的剧集数。 覆盖ID3 / Vorbis元...

    Java面试宝典2012版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到...

    VC++6.0核心编程源码.rar

    你可以看到,每个错误都有3种表示法:即一个消息ID(这是你可以在源代码中使用的一个宏,以便与GetLastError的返回值进行比较),消息文本(对错误的英文描述)和一个号码(你应该避免使用这个号码,而应该使用消息...

    Java面试宝典2012新版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    c++ 面试题 总结

    一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。 段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段...

    Java面试宝典-经典

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

Global site tag (gtag.js) - Google Analytics