线程笔记一: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 ^ | |---------------------------------------| */



原文地址:https://www.cnblogs.com/wgwyanfs/p/6973257.html