您的位置:首页 > 编程语言 > Java开发

java160108TicketDemo2

2016-01-14 10:28 387 查看
/**

* 需求:简单的卖票程序

* 多个窗口同时卖票

* 创建线程的第二种方式

* 步骤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 (对象) {

需要被同步的代码

}

对象如同锁,持有锁的线程可以在同步中执行.

*

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: