Java多线程学习总结
uJavaThreaauJavauJavau两种uJavan(1n(2n(3n1.虚拟的Cavalangan2anaJava中的线程类(Thread)nJava的线程是avalanganpacagecom.yzy;nimportjava.sql.*;nclassThread1extendsThreadnprivateintn;npublicThread1(intn)nthis.n=n;nnpublicvoidrun()nfor(inti=0;i<100;i+)nSystem.out.println(”"+n+""+i+"");nnnnpublicclassSimpleSwingnpublicstaticvoidmain(Stringargs)nThread1t1=newThread1(1);nThread1t2=newThread1(2);nt1.run();nt2.run();nSystem.out.println(”");nn2009-12-14#2009-12-14#t1.run()t2.run()2009-12-14#2009-12-14#Java2009-12-14#JavaThread1继承ThreadThread12009-12-14#Java2009-12-14#Javastart()npacagecom.yzy;nimportjava.sql.*;nclassThread1extendsThreadnprivateintn;npublicThread1(intn)nthis.n=n;nnpublicvoidrun()nfor(inti=0;i<100;i+);nSystem.out.println(”"+n+""+i+"npublicclassSimpleSwingnpublicstaticvoidmain(Stringargs)nThread1t1=newThread1(1);nThread1t2=newThread1(2);ntl.start();nt2.start();nSystem.printin(”");nnn从结果可以看到:主线程先结束,n而在多线程中,main()函real.rn()mainrea.rn()2real.rnrea1.start()treal.rnmain()1mainrea1rearea1Threarea1rnreastart.r2009-12-14#Java2009-12-14#Javarea1.rnrJava中的Runnablen在JDreaJnnaleread(Rnnaletarnnalennaler个构造方法Thread(Runnabletarget)rnet)n()rearunnpackagecom.yzy;nclassThread1implementsRunnablenprivateintn;npublicThread1(intn)nthis.n=n;nnpublicvoidrun()nfor(inti=0;i<200;i+)nSystem.out.println(”"+n+""n+Thread.currentThread().toString()+"的第"+i+"次运行");nnnThreadRunnablen为了回答这个问题,我们通过编写一个应用程序,来进行比较分析.我们用程序来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100npackagecom.yzy;nclassThreadTestextendsThreadnprivateinttickets=100;2009-12-14#Javapublicvoidrun()while(true)if(tickets>0)System.out.println(Thread.currentThread().getName()+"issalingticket"+tickets-);publicclassThreadDemopublicstaticvoidmain(Stringargs)ThreadTestt1=newThreadTest();t1.start();t1.start();t1.start();t1.start();run在上面的代码中,我们用ThreadTest类模拟售票处的售票过程中的每一次循环总票数减1,模拟卖出一张车票,同时该车票.ThreadDemomainstart()ThreadDemomainThreadTestnublicclassThreadDemonublicstaticvoidmain(Stringargs)nneThreadl().start();nneThread1().start();nnewThreadl().start();nnewThread1().start();n100100ThreadTestThreadTestn经过上面的100(该对100张票)npackagecom.yzy;nclassThread1implementsRunnablenprivateinttickets=100;npublicvoidrun()nwhile(true)nif(tickets>0)System.ou.ptrintln(Thread.currentThread().getName()+"issalingticket"+tickets-);publicclasSsimpleSwingpublicstaticvomidain(Stringargs)Thread1t=newThread1();newThread(t).start();newThread(t).start();newThread(t).start();newThread(t).start();nn的是同一个ThreadTest对rn()(tickets)n实现Runnable承了Thread类来说n1)适(程)n2)可Java的单继承Threadunnalen)unnalen0.nif(tickets>0)nSystem.out.println(Thread.currentThread().getName()+”issalingticket”+tickets-);nn假设tickets的值为1的时候,线程1刚执行if(tickets>0)2tickets值仍为1,线程2执tickets为0了线程1上线程1不if(tickets>0)代码,因为先前已经比较过了,并且比较的结果为真,线程1将直接往下nSystem.out.println(Thread.currentThread().getName()+”issalingticket”+tickets-);Thread.sleep()Thread.sleep()()classThreadlimplementsRunnableprivateinttickets=100;publicvoidrun()while(true)if(tickets>0)tryThread.sleep(10);catch(Exceptione)e.printStackTrace();System.out.println(Thread.currentThread().getName()+"issalingticket"+tickets-);publicclassSimpleSwingpublicstaticvoidmain(Stringargs)Thread1t=newThread1();nnewThread(t).start();nnewThread(t).start();nnewThread(t).start();nnewThread(t).start();nnn在上Thread.sleep(10)(tickets>0)nSystem.out.println(Thread.currentThread().getNam”e()i+ssalinticket”+tickets-);n即当到if(tickets>0)synchronized.snhrned2009-12-14#Java2009-12-14#Javansynchronized(object)obect2009-12-14#Java2009-12-14#JavaprivateStringstr=neString(Stringstr=neString(“”)2009-12-14#JavastrrunnclassThread1implementsRunnablenprivateinttickets=100;npublicvoidrun()nStringstr=newString("");nwhile(true)nsynchronized(str)nif(tickets>0)ntrynThread.sleep(10);ncatch(Exceptione)ne.printStackTrace();nnSystem.ou.ptrintln(Thread.currentThread().getName()n+"issalingticket"+tickets-);nnnnnnpublicclasSsimpleSwingnpublicstaticvomidain(Stringargs)nThread1t=newThread1();nnewThread(t).start();nnewThread(t).start();nnewThread(t).start();nnewThread(t).start();nn