@frank-shaw
2015-10-29T10:54:57.000000Z
字数 1023
阅读 1935
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;
}
@Override
public 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();
}
}
}
}