java160108TicketDemo2

来源:互联网 发布:武汉苏格淘宝女装拍摄 编辑:程序博客网 时间:2024/06/11 11:15
/**
 * 需求:简单的卖票程序
 * 多个窗口同时卖票
 * 创建线程的第二种方式
 * 步骤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 (对象) {

需要被同步的代码
}
对象如同锁,持有锁的线程可以在同步中执行.
 * 
 */
0 0
原创粉丝点击