@frank-shaw
2015-10-29T02:54:57.000000Z
字数 1023
阅读 2180
java.多线程
package test1;/** 卖票系统:** 票是共有资源,所以票类就成了资源类* 票类并不是线程,这一点需要注意,它只是线程的资源* 或者说仅仅是包含了线程需要运行的资源与代码* 这样子解释的话就清楚明了一些** 这里为了解决资源共享冲突(线程间通信)问题,使用了重入锁来执行同步操作* 效果很好。只是当时自己有些傻逼,现在好了。* 相比于synchronized,据说可重入锁的效率更高一些*** 关于sleep()方法的一些感想2015.10.27* (1)在抢占CPU资源的时候,线程执行到sleep()方法的时候回使得当前线程放弃* CPU资源,进入阻塞状态* (2)在抢占线程资源(包含锁)的时候,只要在锁内部,即使该部分包含有sleep()* 方法,此时线程依然会放弃CPU资源,但是不会放弃锁资源,所谓“占着茅坑不拉屎”是也。*/import java.util.concurrent.locks.*;public class BuyTicket {public static void main(String[] args) {//票资源Tickets tk = new Tickets(50);//创建3个线程new Thread(tk).start();new Thread(tk).start();new Thread(tk).start();}}/** 该类实现了Runnable,可以实现资源共享* 而票在这里即为共享资源*/class Tickets implements Runnable {int ticketNum;Lock lock = new ReentrantLock();public Tickets() {}public Tickets(int num){this.ticketNum = num;}@Overridepublic void run() {while(true){lock.lock();//这里使用try的原因是使用可重入锁的要求try{if(ticketNum >0){//这里使用try的原因是由于sleep()方法的要求try{Thread.sleep(100);}catch(Exception e){e.printStackTrace();}System.out.println("卖票卖票,快来买啦,不然很快就没有啦~ 卖出第" + ticketNum + "张");ticketNum--;}}finally{lock.unlock();}}}}
