题目:构建四个线程,线程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 ^ | |---------------------------------------| */
时间: 2024-11-08 17:14:34