Android线程—买票demo
2017-05-19 11:06
169 查看
此篇讲述多线程买票小例子
1.实现Runnable接口 实现多线程
public class MyRunnable implements Runnable{
private int ticket=6;//6张票
@Override
public void run() {
for(int i=0;i<=6;i++){//举例 比总票数大即可
if(ticket>0){
System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);
ticket--
}
}
}
}
2.模拟买票窗口
public static void main(String[] args) {
MyRunnable r=new MyRunnable();
Thread r1=new Thread(r, "窗口1");//窗口1 新建状态
Thread r2=new Thread(r,"窗口2");//窗口2 新建状态
Thread r3=new Thread(r,"窗口3");//窗口3 新建状态
r1.start();//窗口1 就绪状态 准备买票
r2.start();//窗口2 就绪状态 准备买票
r3.start();//窗口3 就绪状态 准备买票
}
3.结果
3.1.
窗口3----正在卖票----票总数5
窗口1----正在卖票----票总数6
窗口2----正在卖票----票总数4
窗口1----正在卖票----票总数2
窗口3----正在卖票----票总数3
窗口2----正在卖票----票总数1
3.2.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口1----正在卖票----票总数3
窗口1----正在卖票----票总数2
窗口2----正在卖票----票总数1
3.3.
窗口2----正在卖票----票总数6
窗口3----正在卖票----票总数5
窗口1----正在卖票----票总数6
窗口3----正在卖票----票总数3
窗口2----正在卖票----票总数4
窗口3----正在卖票----票总数1
窗口1----正在卖票----票总数2
显然以上结果 只有3.2是正确的结果 错误的原因在于 Runnable 中多线程共享的方法没有同步
改进
@Override
public void run() {
synchronized (this) {
for(int i=0;i<=100;i++){//举例 比总票数大即可
if(ticket>0){
System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);
ticket--;
}
}
}
}
即给多线程要操作的代码块进行同步
结果1.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口1----正在卖票----票总数3
窗口1----正在卖票----票总数2
窗口1----正在卖票----票总数1
结果2.
窗口2----正在卖票----票总数6
窗口2----正在卖票----票总数5
窗口2----正在卖票----票总数4
窗口2----正在卖票----票总数3
窗口2----正在卖票----票总数2
窗口2----正在卖票----票总数1
结果3.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口1----正在卖票----票总数3
窗口1----正在卖票----票总数2
窗口1----正在卖票----票总数1
结果4.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口1----正在卖票----票总数3
窗口1----正在卖票----票总数2
窗口1----正在卖票----票总数1
以上结果标示加上同步之后一个线程进入买票代码 其他线程就不可进入了 这样就避免的票数不对的问题。 但是有一个问题及只能某一个线程(窗口)访问。
改进
private int ticket=6;//6张票
@Override
public void run() {
for(int i=0;i<=100;i++){//举例 比总票数大即可
sell();
}
}
public synchronized void sell(){
if(ticket>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);
ticket--;
}
}
即将同步放到 run 方法外部
结果
1.
窗口2----正在卖票----票总数6
窗口2----正在卖票----票总数5
窗口3----正在卖票----票总数4
窗口3----正在卖票----票总数3
窗口3----正在卖票----票总数2
窗口1----正在卖票----票总数1
2.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口3----正在卖票----票总数3
窗口3----正在卖票----票总数2
窗口3----正在卖票----票总数1
1.实现Runnable接口 实现多线程
public class MyRunnable implements Runnable{
private int ticket=6;//6张票
@Override
public void run() {
for(int i=0;i<=6;i++){//举例 比总票数大即可
if(ticket>0){
System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);
ticket--
}
}
}
}
2.模拟买票窗口
public static void main(String[] args) {
MyRunnable r=new MyRunnable();
Thread r1=new Thread(r, "窗口1");//窗口1 新建状态
Thread r2=new Thread(r,"窗口2");//窗口2 新建状态
Thread r3=new Thread(r,"窗口3");//窗口3 新建状态
r1.start();//窗口1 就绪状态 准备买票
r2.start();//窗口2 就绪状态 准备买票
r3.start();//窗口3 就绪状态 准备买票
}
3.结果
3.1.
窗口3----正在卖票----票总数5
窗口1----正在卖票----票总数6
窗口2----正在卖票----票总数4
窗口1----正在卖票----票总数2
窗口3----正在卖票----票总数3
窗口2----正在卖票----票总数1
3.2.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口1----正在卖票----票总数3
窗口1----正在卖票----票总数2
窗口2----正在卖票----票总数1
3.3.
窗口2----正在卖票----票总数6
窗口3----正在卖票----票总数5
窗口1----正在卖票----票总数6
窗口3----正在卖票----票总数3
窗口2----正在卖票----票总数4
窗口3----正在卖票----票总数1
窗口1----正在卖票----票总数2
显然以上结果 只有3.2是正确的结果 错误的原因在于 Runnable 中多线程共享的方法没有同步
改进
@Override
public void run() {
synchronized (this) {
for(int i=0;i<=100;i++){//举例 比总票数大即可
if(ticket>0){
System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);
ticket--;
}
}
}
}
即给多线程要操作的代码块进行同步
结果1.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口1----正在卖票----票总数3
窗口1----正在卖票----票总数2
窗口1----正在卖票----票总数1
结果2.
窗口2----正在卖票----票总数6
窗口2----正在卖票----票总数5
窗口2----正在卖票----票总数4
窗口2----正在卖票----票总数3
窗口2----正在卖票----票总数2
窗口2----正在卖票----票总数1
结果3.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口1----正在卖票----票总数3
窗口1----正在卖票----票总数2
窗口1----正在卖票----票总数1
结果4.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口1----正在卖票----票总数3
窗口1----正在卖票----票总数2
窗口1----正在卖票----票总数1
以上结果标示加上同步之后一个线程进入买票代码 其他线程就不可进入了 这样就避免的票数不对的问题。 但是有一个问题及只能某一个线程(窗口)访问。
改进
private int ticket=6;//6张票
@Override
public void run() {
for(int i=0;i<=100;i++){//举例 比总票数大即可
sell();
}
}
public synchronized void sell(){
if(ticket>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ "----正在卖票----票总数"+ticket);
ticket--;
}
}
即将同步放到 run 方法外部
结果
1.
窗口2----正在卖票----票总数6
窗口2----正在卖票----票总数5
窗口3----正在卖票----票总数4
窗口3----正在卖票----票总数3
窗口3----正在卖票----票总数2
窗口1----正在卖票----票总数1
2.
窗口1----正在卖票----票总数6
窗口1----正在卖票----票总数5
窗口1----正在卖票----票总数4
窗口3----正在卖票----票总数3
窗口3----正在卖票----票总数2
窗口3----正在卖票----票总数1
相关文章推荐
- RxJava + httpURLConnectionde 的简单测试demo,可以拿来处理一般的android访问网络的线程问题
- Android线程—升华demo
- Android实例demo4之标题、线程发短信
- Android 使用线程更新UI(附带计时器demo)
- (转)远程线程DEMO
- android简单demo学习系例之排版(LinearLayout)[xml-based]
- Android线程模型(Painless Threading)
- Android线程模型(Painless Threading)
- android简单demo学习系例之排版(LinearLayout)[code-based]
- 我的第一个Android 多媒体的Demo
- Android 进程与线程
- video player demo in android
- Android Development Demo: “DialANumber”
- Android 实现联网——在线程中联网
- Android中的线程模型
- android 改变线程优先级Change Thread Priority
- 不明白Android的Demo中为何要用synchronized同步SrufaceHolder
- android简单demo学习系例之按钮
- video player demo in android
- Android单线程模型相关概念详解