孙鑫java视频——多线程总结
2012-06-05 09:39
316 查看
//模拟火车票售票系统 class TicketsThread{ public static void main(String args[]) { SellThread mythread=new SellThread(); new Thread(mythread).start(); new Thread(mythread).start(); new Thread(mythread).start(); new Thread(mythread).start(); //这4个线程同时进行售票 } } class SellThread implements Runnable{ int tickets=100;//一共要卖100张票 public void run() { while(true){ if(tickets>0){ try{ Thread.sleep(10);//这10毫秒用来处理一些数据或其他售票过程 } catch(Exception e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"sell ticket:"+tickets); tickets--; } } } } 问题1:Runnable 和 Thread有什么关系和区别? 答:实现多线程程序的两种方式: (1)从Thread类继承; (2)实现Runnable接口。 Thread类实现了Runnable接口。 如果多个线程访问同一个资源(比如变量),那么必须使用方式(2)。 除非要使用Thread中除run方法以外的其他方法,才用方式(1)。一般,只需用方法(2)。 问题2:如果运行上面这个程序,输出是: ....... //把前面正常的输出省略了 Thread-3sell tickets 1 Thread-0sell tickets 0 Thread-1sell tickets -1 Thread-2sell tickets -2 很明显,结果是错误的,怎么可能卖出0,-1,-2这三张票?? 关键就在Thread.sleep(10);这里。在这里,四个进程的时间片发生了轮换。 我们可以使用同步机制解决这个问题。这里不做解释,看代码: class TicketsSystem { public static void main(String[] args) { SellThread st=new SellThread(); new Thread(st).start(); new Thread(st).start(); new Thread(st).start(); new Thread(st).start(); } } class SellThread implements Runnable { int tickets=100; Object obj=new Object(); public void run() { while(true) { synchronized(obj) { try { Thread.sleep(10); } catch(Exception e) { e.printStackTrace(); } if(tickets>0) { System.out.println("obj:"+Thread.currentThread().getName()+" sell tickets:"+tickets); tickets--; } //或者调用sell() } } } } public synchronized void sell() { synchronized(obj) { if(tickets>0) { try { Thread.sleep(10); } catch(Exception e) { e.printStackTrace(); } System.out.println("sell():"+Thread.currentThread().getName()+ " sell tickets:"+tickets); tickets--; } } } }
相关文章推荐
- 孙鑫Java视频总结---------线程
- 40个Java多线程问题总结
- 40个java多线程问题总结
- 【J2SE视频总结】——初识Java
- 面试总结------Java内存管理与多线程
- 重拾java基础(十七):多线程上总结
- Java多线程总结之聊一聊Queue
- java多线程总结
- 40个Java多线程问题总结
- Java多线程之内存可见性与原子性总结
- java多线程和并发编程学习总结 ----基础篇4
- 40个Java多线程问题总结
- Java多线程(6)——Thread类中的一些方法(传智播客毕老师视频讲解)
- 黑马程序员java基础篇----多线程总结(下)
- Java总结篇系列:Java多线程(一)
- java多线程总结笔记4——线程互斥与同步
- java多线程总结(6)
- 总结-Java何时需要使用多线程
- Java多线程初步--总结
- Java多线程总结(二):理解对象锁 & synchronized和Lock的区别