启动三个线程A,B,C,按ABC的顺序输出10次

package jun;

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

/**
 * 启动三个线程A,B,C,按ABC的顺序输出10次
 * 
 * @author xiejunbo
 *
 */
public class ABC {

	private int cond = 0;//控制ABC输出
	private Lock lock = new ReentrantLock();//通过jdk的锁来保证线程访问的互斥
	private Condition condition = lock.newCondition();//线程协作

	public static void main(String[] args) {
		ABC abc = new ABC();
		ThreadA ta = abc.new ThreadA();
		ThreadB tb = abc.new ThreadB();
		ThreadC tc = abc.new ThreadC();
		ExecutorService executor = Executors.newFixedThreadPool(3);//通过线程池执行

		for (int i = 0; i < 10; i++) {
			executor.execute(ta);
			executor.execute(tb);
			executor.execute(tc);
		}
		executor.shutdown();
	}

	class ThreadA implements Runnable {

		public void run(){
			lock.lock();//加锁
			try {
				while (true) {
					if(cond % 3 == 0) {
						System.out.print(cond + "A ");
						cond++;
						condition.signalAll();
						break;
					}else{
						try {
							condition.await();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			} finally {
				lock.unlock();//解锁
			}
		}
	}

	class ThreadB implements Runnable{

		public void run(){
			lock.lock();
			try {
				while (true) {
					if (cond % 3 == 1) {
						System.out.print(cond + "B ");
						cond++;
						condition.signalAll();
						break;
					} else {
						try {
							condition.await();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			} finally {
				lock.unlock();
			}
		}
	}

	class ThreadC implements Runnable {

		public void run(){
			lock.lock();
			try {
				while(true){
					if(cond % 3 == 2){
						System.out.println(cond + "C ");
						cond++;
						condition.signalAll();
						break;
					}else{
						try {
							condition.await();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			} finally {
				lock.unlock();
			}
		}
	}

}
时间: 2024-08-27 17:52:48

启动三个线程A,B,C,按ABC的顺序输出10次的相关文章

编写一个函数,计算三个数字的大小,按从小到大的顺序输出。

[超简单的三人之间数据交换] 挺像魔术师扔球球,魔术师扔球球,魔术师扔球球,魔术师扔球球,你说像不像~~~~~~~~~~像不像~~~~~~·像不像 1 //编写一个函数,计算三个数字的大小,按从小到大的顺序输出. 2 function order(a,b,c) { 3 var temp; 4 var str; 5 if (a>b) { 6 temp = a ; 7 a = b ; 8 b = temp ; 9 } 10 if (b>c) { 11 temp = b; 12 b = c ; 13

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多线程学习(三)——线程栈

一.线程栈模型 线程栈模型是理解线程调度原理以及线程执行过程的基础.线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶,线程栈的内容是随着线程的运行状态变化而变化的,研究线程栈必须选择一个运行的时刻(指代码运行到什么地方) 上图中的栈A是主线程main的运行栈信息,当执行new JavaThreadDemo().threadMethod();方法时,threadMethod方法位于主线程栈中的栈顶,在threadMethod方法中运行的start()方法新建立了一个线程,此时,

Tomcat学习 HttpConnector和HttpProcessor启动流程和线程交互

一.tomat启动流程 1.启动HttpConnector connector等待连接请求,只负责接受socket请求,具体处理过程交给HttpProcessor处理. tomcat用户只能访问到connector,能设置接受的数据的buffer大小,而不能看见HttpProcessor的处理过程. 2.创建HttpProcessor对象池 创建对象后马上调用start()方法启动processor的线程: private HttpProcessor newProcessor() { HttpP

第三章线程同步辅助类

Java 7 并发编程实战手册目录 代码下载(https://github.com/Wang-Jun-Chao/java-concurrency) 第三章线程同步辅助类 3.1简介 ?信号量(Semaphore):是一种计数器,用来保护一个或者多个共享资源的访问.它是并发编程的一种基础工具,大多数编程语言都提供了这个机制. ? CountDownLatch:是Java语言提供的同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许线程一直等待. ? CyclicBarrier也是Java语言

实现多线程的同时复制(三个线程同时复制)

1 package com.threadcopyfile; 2 3 /** 4 * @author lisj 5 * 实现多线程的同时复制 6 * 调用多个线程同时复制各自的模块 7 */ 8 public class threadCopy { 9 10 11 public static void main (String args[]){ 12 13 ThreadCopyFile a=new ThreadCopyFile(1); //实例化多个线程 14 ThreadCopyFile b=ne

有三个线程T1 T2 T3,如何保证他们按顺序执行-转载

T3先执行,在T3的run中,调用t2.join,让t2执行完成后再执行t3 在T2的run中,调用t1.join,让t1执行完成后再让T2执行 public class Test { // 1.现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行 public static void main(String[] args) { final Thread t1 = new Thread(new Runnable() { @Override public voi

Nucleus PLUS的启动、运行线程和中断处理

nucleus系统是实时嵌入式操作系统,具有实时.任务抢先.多任务内核,其中95%的代码由C语言写成,极易移植,开放的源码使得配置和裁剪方便,再加上体积小(全部二进制映像可仅20K).响应快速等特性,使得Nucleus PLUS得到广泛应用.另外,所谓的实时指的是对外部或者内部的事件在正确的时间内必须得到正确的响应,而不仅仅指的是"立即能够响应". (一)Nucleus PLUS启动流程 INT_Initialize 子程序在Nucleus PLUS 系统中是最先运行的.负责所有与目标

使用三个线程在一个字符后面顺序添加字符

一.先来了解一下多线程中fina域l的内存语义,大家都知道多线程并行执行时,就会出现编译器执行时并不是顺序执行代码的,因此我们必须加入一些关键字来使得我们的程序能够顺序执行,就是所谓的内存可见性,下面先来了解一下final的内存语义. 1.fina域的内存语义遵守两个重排序规则:(1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序.(2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能冲排序.