您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > Java中Thread的使用死锁以及生产者消费者问题详解
for(inti=0;i100;i++){21System.out.println(******线程4****+i);22}23}24}).start();25for(inti=0;i100;i++){26System.out.println(******主线程****+i);27}28}29}30/**31*32*四种方法实现线程的创建,两种运用的是内部类一种是实现接口,一种是继承线程33*34*/35classMyThread1extendsThread{36@Override37publicvoidrun(){38for(inti=0;i100;i++){39System.out.println(++++线程一+++++++i);40}41}42}43classMyThread2implementsRunnable{44@Override45publicvoidrun(){46for(inti=0;i100;i++){47System.out.println(-----线程二-------+i);48}49}50}当想让线程暂时暂停,进入休眠状态,可以用Sleep实现,该方法是静态方法,可以直接被Thread引用。可以在方法中设置休眠的时间。下面通过一个例子来说明Sleep的用法1packagejava819;2importjava.io.IOException;3importjava.nio.CharBuffer;4publicclassTestSleep{5publicstaticvoidmain(String[]args){6Runnerr=newRunner();7Threadt1=newThread(r);8Threadt2=newThread(r);9t1.start();10t2.start();11}12}13classRunnerimplementsRunnable{14@Override15publicvoidrun(){16for(inti=0;i200;i++){17if(i%10==0&&i!=0){18try{19Thread.sleep(1000);//Sleep的用法20}catch(InterruptedExceptione){21e.printStackTrace();22}23}24System.out.println(——————————线程————————————+i);25}26}27}当想让一个线程先执行完再去执行另一个线程时,可以用Join方法将当前线程先执行完。下面通过一个例子来说明Join的用法。1packagecn.yj3g;2publicclassTestJoin{3publicstaticvoidmain(String[]args){4MyThread2t1=newMyThread2(zhangcun);5t1.start();6try{7t1.join();//先执行调用join方法的线程对象的run方法,完成后才调用这条语句所在的线程8}catch(InterruptedExceptione){9e.printStackTrace();10}1112for(inti=1;i=10;i++){13System.out.println(------iammainthread);14}15}16}17classMyThread2extendsThread{18MyThread2(Strings){19super(s);20}21publicvoidrun(){22for(inti=1;i=10;i++){23System.out.println(Iam+getName());24try{25sleep(1000);26}catch(InterruptedExceptione){27System.out.println(又被打爆了!);28return;29}30}31}32}当需要一个线程让出当前执行状态即CPU,给其他线程执行的机会,就需要使用Yield方法,使当前线程暂时阻塞,让程序去执行其他的线程。还是通过一个例子来说明。1packagejava819;2publicclassTestYield{3publicstaticvoidmain(String[]args){4MyYieldmy1=newMyYield();5MyYield2my2=newMyYield2();6my1.start();7my2.start();89}10}11classMyYieldextendsThread{12@Override13publicvoidrun(){14for(inti=0;i100;i++){15System.out.println(数字为:+i);16if(i%10==0&&i!=0){17yield();18}19}20}21}22classMyYield2extendsThread{23@Override24publicvoidrun(){25for(inti=0;i100;i++){26System.out.println(线程二数字为:+i);27if(i%10==0&&i!=0){28yield();29}30}31}32}判断当前线程是否还在执行可以使用Thread.currentThread().isAlive()实现。如果想让某一个线程的优先级优先,可以通过setPriority来设置线程的优先级。当然也会有一个getPriority来获取优先级MinPriority=1,MaxPriority=10,NomPriority=5。下面通过一个例子来说明setPriority的用法。1packagejava819;2publicclassTestPriority{3publicstaticvoidmain(String[]args){4T1t=newT1();5T2tt=newT2();6tt.setPriority(Thread.NORM_PRIORITY+4);//设置线程的优先级来改变线程的优先级7t.start();8tt.start();9}10}11classT1extendsThread{1213@Override14publicvoidrun(){15for(inti=0;i100;i++){16System.out.println(线程T1+i);17}18}19}20classT2extendsThread{2122@Override23publicvoidrun(){24for(inti=0;i100;i++){25System.out.println(--------线程T2+i);26}27}28}如果想实现当一个线程在占用一个资源时,不让别的线程来抢占资源,可以使用synchronized来修饰方法或者语句块,这样别的线程就不会进入synchronized修饰的方法或者方法块。wait()和sleep()的区别:1wait()时别的线程可以访问锁定对象。2调用该方法时必须锁定该对象。3sleep()时别的线程不可以访问锁定对象。如果两个线程互相占用对方资源,那么线程将会进入死锁状态,在实现线程时,应该尽量避免死锁情况。下面就是一个典型的死锁例子,在编程时,我们应该要避免死锁的发生。死锁例子:1packagejava819;2publicclassTestDeadLockimplementsRunnable{3publicintflag=1;4staticObjecto1=newObject(),o2=newObject();5@Override6publicvoidrun(){7System.out.println(flag=+flag);8if(flag==1){9synchronized(o1){10try{11Thread.sleep(500);12}catch(Exceptione){13e.printStackTrace();14}15synchronized(o2){16System.out.println(1);17}18}19}20if(flag==0){21synchronized(o2){22try{23Thread.sleep(500);24}catch(Exceptione){25e.printStackTrace();26}27synchronized(o1){28System.out.println(0);29}30}31}32}33publicstaticvoidmain(String[]args){34TestDeadLocktd1=newTestDeadLock();35TestDeadLocktd2=newTestDeadLock();36td1.flag=1;37td2.flag=0;38Threadt1=newThread(td1);39Threadt2=newThread(td2);40t1.start();41t2.start();42}43}通过以上所学的知识,我们就可以实现生活中常遇到的一个生产者消费者问题。下面我就通过一个实例来对这个问题进行下说明。生产者消费者问题:1packagecn.yj3g;2publicclassTestPC{3publicstaticvoidmain(String[]args){4PizzaStackps=newPizzaStack();56Threadt1=newThread(newCooker(ps));7Threadt3=newThread(newCooker(ps));8Threadt5=newThread(newCooker(ps));9Threadt2=newThread(newCustomer(ps));10Threadt4=newThread(newCustomer(ps));11t1.start();12t3.start();13t2.start();14t4.start();15t5.start();16}17}18/*19*厨子20*/21classCookerimplementsRunnable{22PizzaStackps;2324publicCooker(PizzaStackps){25this.ps=ps;26}2728@Override29publicvoidrun(){30ps.push();31}32}33/*34*食客35*/36classCustomerimplementsRunnable{37PizzaStackps;38publicCustomer(PizzaStackps){39this.ps=ps;40}41@Override42publicvoidrun(){43ps.pop();44}45}46/*47*pizza48*/49classPizza{50intid;51publicPizza(intid){52this.id=id;53}54publicStringtoString(){55returnpizza+id;56}57}58/*59*pizza筐60*/61classPizzaStack{//栈62privatePizza[]ps=newPizza[10];63intsize;64publicvoidpush(){65while(size=0&&sizeps.length){66synchronized(this){//此语句块锁住67this.notifyAll();//唤醒所有线程68Pizzap=newPizza(size);69ps[size++]=p;70System.out.println(+++++++生产了+p+剩下+size+个);71}72try{73Thread.sleep((long)(Math.random()*1000));74}catch(InterruptedExceptione){75e.pri
本文标题:Java中Thread的使用死锁以及生产者消费者问题详解
链接地址:https://www.777doc.com/doc-2878500 .html