首页 > 代码库 > 线程笔记一:java线程经典题目:轮流打印

线程笔记一:java线程经典题目:轮流打印

题目:构建四个线程,线程A将变量100加1,B减1,c加1,D减1,要按照A->B->C->D的顺序执行,最终数字还为100.使用多线程

代码:

PrintLetter.java
import java.lang.Thread;
class MyThread implements Runnable{
	
	//给线程分配三个对象
	private Object pre;
	private Object self;
	private Num num;
	
	public MyThread(Object pre,Object self,Num num){
		this.pre=pre;
		this.self=self;
		this.num=num;
	}

	public void run(){
		for(int i=0;i<10;i++){
			synchronized(pre){
				synchronized(self){
					synchronized(num){
						self.done(num,Thread.currentThread().getName());
						self.notify();//唤醒其他线程释放对象锁
					}
				}
				//否则或者运行完成后释放前一个对象锁
				try{
					pre.wait();
				}catch(Exception e){
					e.printStackTrace();	
				}
			}
		}	
	}
}
//数字对象
class Num{
	public int num=100;
	public void add(){
		this.num++;
	}
	public void resuce(){
		this.num--;
	}
	public int get(){
		return this.num;
	}
}

class Object{
	boolean done;//表示加或减
	public Object(boolean done){
		this.done=done;
	}
	public void done(Num num,String name){
		if(this.done){
			num.add();
			System.out.println(""+name+" add---- one,Then num="+num.get());
		}else{
			num.resuce();
			System.out.println(""+name+" reduce one,Then num="+num.get());
		}
	}
}

public class PrintLetter{
	public static void main(String args[]){
		//定义四个对象
		Object first=new Object(true);
		Object two=new Object(false);
		Object three=new Object(true);
		Object four=new Object(false);
		Num num=new Num();
		MyThread mythread1=new MyThread(four,first,num);
		MyThread mythread2=new MyThread(first,two,num);
		MyThread mythread3=new MyThread(two,three,num);
		MyThread mythread4=new MyThread(three,four,num);
		new Thread(mythread1).start();
		try{
			Thread.sleep(100);
		}catch(Exception e){
		
		}		
		new Thread(mythread2).start();
		try{
			Thread.sleep(100);
		}catch(Exception e){
		
		}
		new Thread(mythread3).start();
		try{
			Thread.sleep(100);
		}catch(Exception e){
		
		}
		new Thread(mythread4).start();
		try{
			Thread.sleep(100);
		}catch(Exception e){
		
		}
	}
}
结果:


过程解析:

/*
	四把锁 a b c d
	线程1  临界区要获得锁d a
	线程2  临界区要获得锁a b
	线程3  临界区要获得锁b c
	线程4  临界区要获得锁c d

	执行线程1的时 由于线程1 获得了锁a,所以线程2会等待线程1释放锁a,线程2得到锁b
	线程3会等待线程2是否锁b,线程4等待锁c和d.

	线程1执行完临界区后,调用a.notify,释放自身锁,此时线程2被唤醒,开始执行,连锁反应
	线程3线程4会的到顺序执行。 此外线程1调用d.wait等待其他线程唤醒,当执行完线程4的时候
	调用d.notify 又会唤醒线程1. 此过程反复,直到所有线程执行完毕。线程1 2 3 4会得到顺序执行

	执行1唤醒2   执行2唤醒3   执行3唤醒4   执行4唤醒1:
	1-------------->2-------->3------------>4
	^                                       |
	|---------------------------------------|

*/


线程笔记一:java线程经典题目:轮流打印