嗯嗯嗯,记录一下自己最近自己又研究了一下关于Thread和Runnable实现线程同步买票
1,实现Runnable接口,重写里面run()方法,比较推荐的一种方式
避免了单继承局限性
增强程序的扩展性,将设置程序线程任务和开启新线程进行了分离
### 使用同步代码块方式
public class RunnableSale implements Runnable {
private int ticket = 100;
Object obj = new Object();
@Override
public void run() {
while (true) {
synchronized (obj){
if (ticket > 0) {
try {
Thread.sleep(new Random().nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "=======" + "卖出第" + ticket-- + "张票");
}
}
}
}
}
### 同步方法方式实现
public class RunnableSale implements Runnable {
private int ticket = 100;
Object obj = new Object();
@Override
public void run() {
while (true) {
sale();
}
}
private void sale() {
if (ticket > 0) {
try {
Thread.sleep(new Random().nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "=======" + "卖出第" + ticket-- + "张票");
}
}
}
### 测试
public class SaleFlat{
public static void main(String[] args) {
RunnableSale run=new RunnableSale();
for (int i = 1; i < 5; i++) {
new Thread(run,i+"号窗口").start();
}
}
}
结果
注意
private int ticket = 100;
1,这里ticket为普通的int就可,因为我们在用的使用使用的是同一个RunnableSale对像
2,同步方法的锁对象是this
使用Thread类实现
### 使用同步代码块实现
public class SaleTicket extends Thread {
public SaleTicket(String name) {
super(name);
}
private static int ticket = 100;
String str = "suo";
@Override
public void run() {
while (true) {
synchronized (str){
if (ticket > 0) {
if (ticket == 50) {
try {
Thread.sleep(new Random().nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(this.getName() + "卖出第" + ticket-- + "张票");
}
}
}
}
}
### 使用同步方法执行
public class SaleTicket extends Thread {
public SaleTicket(String name) {
super(name);
}
private static int ticket = 100;
String str = "suo";
@Override
public void run() {
sale();
}
private synchronized void sale() {
while (true) {
if (ticket > 0) {
if (ticket == 50) {
try {
Thread.sleep(new Random().nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(this.getName() + "卖出第" + ticket-- + "张票");
}
}
}
}
测试
public class SaleFlat{
public static void main(String[] args) {
for (int i = 1; i < 5; i++) {
SaleTicket t=new SaleTicket(i+"号窗口");
t.start();
}
}
注意
这里同步代码块使用this结果
private static int ticket = 100;
1,这里必须为static,因为在使用的时候我们是创建了4个对象,所以不会公用这个成员变量
,必须声明静态不然每个窗口单独买100张
2,这里同步方法我用this作锁对象并不可以,我个人认为呢这里锁对象本来是要求必须为同一对象
但是使用这里创建了4个对象,每个this都是不一样的,无法起到同步作用,要是不是这样的
希望前辈们留言告知呀呀呀呀