多线程的应用
需求
- 三个线程,名字分别为“张三”,“李四”,“票贩子”,共同抢100张火车票
- 每个线程抢到一张票后,都必须休眠500ms,以模拟网络延迟
- 票贩子只能抢一张
package test;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author ZoyLiaN
*/
public class TicketOffice implements Runnable{
private int count = 100; //记录剩余票数
private int no = 0; //记录买到第几张票
private boolean flag = false; //记录是否售完
public void run(){
while(true){
if(!sale()) {break;} //线程启动后调用run方法,循环调用sale()
}
}
public synchronized boolean sale(){
if(count == 0) return false;
no++;
count--;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"抢到第"+no+"张票,剩余"+count+"张票!");
//字符串比较尽量用equals而不是等号呀 〒▽〒
if("票贩子".equals(Thread.currentThread().getName())) //票贩子只能抢一张
{return false;}
return true;
}
}
package test;
/**
* @author ZoyLiaN
*/
public class Test {
public static void main(String[] args) {
TicketOffice t = new TicketOffice();
Thread t1 = new Thread(t);
Thread t2= new Thread(t);
Thread t3 = new Thread(t);
t1.setName("张三");
t2.setName("李四");
t3.setName("票贩子");
t1.start();
t2.start();
t3.start();
}
}
总结
本憨憨的main中最先开始是这么写 的
Thread t1 = new Thread(new Ticketoffice());
Thread t2 = new Thread(new Ticketoffice());
Thread t3 = new Thread(new Ticketoffice());
然后发现sale() 函数加不加 synchronized 结果 居然都不同步
后来发现
其实这样写, 实际上是new出了三个对象, 但是, 一个Java对象就有一把锁
所有, 这里有三把锁
所以, 锁不住哇, 这样的三个线程互不干扰, 没法同步
换个理解方式就是, synchronized 锁定的是当前的 特定的 某对象 ,该对象的线程们一个个执行
而这里却是三个对象