/**
* 需求:简单的卖票程序
* 多个窗口同时卖票
* 创建线程的第二种方式
* 步骤1:定义类实现Runnable 接口
* 通过Thread类创立线程对象
* 将Runnable 接口的子类对象作为实际参数传递给Thread类的构造函数
* 调用Thread类的start方法开启线程并调用Runnable 接口子类的构造函数
*/
/**
* 注意比较线程实现的两种方式
*/
package java160108;
/**
* @author LiZheng
* 问题的原因:
* 当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分
* 里一个线程参与进来执行,导致共享数据的错误
*
*/
public class TicketDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// Ticket2 ticket1 = new Ticket2();
//
// Ticket2 ticket2 = new Ticket2();
// Ticket2 ticket3 = new Ticket2();
// Ticket2 ticket4 = new Ticket2();
// ticket1.start();
// ticket2.start();
// ticket3.start();
// ticket4.start();
Ticket2 ticket=new Ticket2();
Thread thread1=new Thread(ticket);
Thread thread2=new Thread(ticket);
Thread thread3=new Thread(ticket);
Thread thread4=new Thread(ticket);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
/**
*
* @author LiZheng
* 多线程运行出现安全问题
*
* 解决办法:
* 对多条操作共享数据的语句,只能让一个线程在某一时间内执行完毕.在执行过程中,其他线程不许执行
*
*
*同步代码块
*/
class Ticket2 // extends Thread
implements Runnable {
// private static int tick = 100;// static的生命周期较长,在此程序中不建议使用
// @Override
// public void run() {
// super.run();
// while (true) {
// if (tick > 0) {
//
// System.out.println(currentThread().getName() + "sale..." + tick--);
// }
// }
//
// }
// private int tick = 100;
// @Override
// public void run() {
// while (true) {
// if (tick > 0) {
//
// System.out.println(Thread.currentThread().getName() + "...sale..." + tick--);
// }
// }
//
// }
private int tick = 100;
Object obj=new Object();
@Override
public void run() {
while (true) {
//synchronized同步代码块的关键字,参考火车卫生间是否有人
synchronized (obj) {
if (tick > 0) {
try {
//此处会引发多线程的问题
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "...sale..." + tick--);
}
}
}
}
}
/**
* synchronized (对象) {
需要被同步的代码
}
对象如同锁,持有锁的线程可以在同步中执行.
*
*/
* 需求:简单的卖票程序
* 多个窗口同时卖票
* 创建线程的第二种方式
* 步骤1:定义类实现Runnable 接口
* 通过Thread类创立线程对象
* 将Runnable 接口的子类对象作为实际参数传递给Thread类的构造函数
* 调用Thread类的start方法开启线程并调用Runnable 接口子类的构造函数
*/
/**
* 注意比较线程实现的两种方式
*/
package java160108;
/**
* @author LiZheng
* 问题的原因:
* 当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分
* 里一个线程参与进来执行,导致共享数据的错误
*
*/
public class TicketDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// Ticket2 ticket1 = new Ticket2();
//
// Ticket2 ticket2 = new Ticket2();
// Ticket2 ticket3 = new Ticket2();
// Ticket2 ticket4 = new Ticket2();
// ticket1.start();
// ticket2.start();
// ticket3.start();
// ticket4.start();
Ticket2 ticket=new Ticket2();
Thread thread1=new Thread(ticket);
Thread thread2=new Thread(ticket);
Thread thread3=new Thread(ticket);
Thread thread4=new Thread(ticket);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
/**
*
* @author LiZheng
* 多线程运行出现安全问题
*
* 解决办法:
* 对多条操作共享数据的语句,只能让一个线程在某一时间内执行完毕.在执行过程中,其他线程不许执行
*
*
*同步代码块
*/
class Ticket2 // extends Thread
implements Runnable {
// private static int tick = 100;// static的生命周期较长,在此程序中不建议使用
// @Override
// public void run() {
// super.run();
// while (true) {
// if (tick > 0) {
//
// System.out.println(currentThread().getName() + "sale..." + tick--);
// }
// }
//
// }
// private int tick = 100;
// @Override
// public void run() {
// while (true) {
// if (tick > 0) {
//
// System.out.println(Thread.currentThread().getName() + "...sale..." + tick--);
// }
// }
//
// }
private int tick = 100;
Object obj=new Object();
@Override
public void run() {
while (true) {
//synchronized同步代码块的关键字,参考火车卫生间是否有人
synchronized (obj) {
if (tick > 0) {
try {
//此处会引发多线程的问题
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "...sale..." + tick--);
}
}
}
}
}
/**
* synchronized (对象) {
需要被同步的代码
}
对象如同锁,持有锁的线程可以在同步中执行.
*
*/