Java 线程同步练习-模拟动画打印

  1. /* 有三个线程,线程1输出为:1、2、3、4、5;线程2输出为:a、b、c、d、e;线程3输出为:张、王、李、赵、刘;要求三个线程同步输出,
    使得最终输出结果为:1、a、张、2、b、王、3、c、李……
    【提示】布尔型只有两个值,只能控制两个线程,因此对象的状态需要int型数据控制
    */
class Flag{
	private int flag=1;
	String [] a;
	public void get(int current,int next) {
		while(flag!=current) 
			try { wait();} catch(Exception e){;}
		flag = next;
		notifyAll(); //必须用notifyAll因为有多个线程在等待
	}
}
class Print extends Thread{
	private Flag f;
	String [] a;
	int current,next;
	Print(Flag x,int y,int z,String[] w){ 
		f = x;
		current = y;
		next = z;
		a = w;
	}
	public void run() {
		synchronized(f){
			for(String x:a) {
				f.get(current, next);
				System.out.print(x+" ");
				try {Thread.sleep(100);}catch(Exception e) {;}
			}		
		}
	}
}

class app_Print{
	public static void main(String [] args) {
		String [] s1 = {"1","2","3","4","5"};
		String [] s2 = {"a","b","c","d","e"};
		String [] s3 = {"张","王","李","赵","刘"};
		Flag f = new Flag();
		Print p1 = new Print(f,1,2,s1);
		Print p2 = new Print(f,2,3,s2);
		Print p3 = new Print(f,3,1,s3);
		p1.start(); p2.start(); p3.start();
		try {p1.join();p2.join();p3.join();}
		catch(Exception e) {;}
		//三个join表示p1,p2,p3不执行完毕,就无法走到这里
		System.out.print("\n线程结束");//希望此语句作为最后一条语句输出
	}
}

在这里插入图片描述
实现框架:
(1)多个线程通过一个对象进行关联,类比【生产者、消费者】通过【缓冲区】关联;
(2)关联对象提供一个状态标志【类比缓冲区】,由该标志决定是等待还是执行;
(3)各线程基于关联对象进行同步,即run中使用synchronized(D) {S}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值