zoukankan      html  css  js  c++  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 ^ | |---------------------------------------| */



  • 相关阅读:
    用windows脚本实现文件下载
    pku1325 Machine Schedule
    中位数
    pku1468 Rectangles
    最小密度路径
    合并序列
    PowerDesigner(5)转载
    责任链模式
    PowerDesigner(3)转载
    解释器模式
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6973257.html
Copyright © 2011-2022 走看看