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 (对象) {
需要被同步的代码
}
对象如同锁,持有锁的线程可以在同步中执行.
*
*/
* 需求:简单的卖票程序
* 多个窗口同时卖票
* 创建线程的第二种方式
* 步骤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
- java160108TicketDemo2
- 【OpenCV入门指南】第八篇 灰度直方图
- 打包静态库整理
- RecyclerView添加Header
- 在MyEclipse 2014 中使用JUnit-(二)
- 求一个整数的二进制中1的个数(转)
- java160108TicketDemo2
- 【OpenCV入门指南】第九篇 灰度直方图均衡化
- PHP中的资源类型
- MySQL运行原理与基础架构
- ANDROID自动化测试工具合集
- fragment中onActivityResult 解决方法总结
- Thread实现接口 Runnable
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
- AndroidStutio按住ctr滚动鼠标齿轮改变字体大小