A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋旭东 中级黑马   /  2013-7-4 16:56  /  874 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程的问题:
就那毕老师视频中讲的那个售票程序来说吧
1,为啥里面要用死循环啊?while(true)
2,多线程里面加上了同步代码块,牺牲了程序的性能提高了安全性,那这里岂不是和单线程一样?
还是说:同步代码块只是程序的一小部分,只有在运行到这里时才会单线程运行,代码块外还是提高了效率?有点晕晕呼呼的,麻烦大家结合好懂的例子
说一下多线程加上同步代码块,是不是和直接单线程一样了??

  • /*
  • * 4个窗口同时售票,总票数为100张,多线程思想
  • */
  • //定义一个类去实现Runnable接口,这种方法避免了单继承的局限性,
  • class Ticket implements Runnable{
  • private int ticket=100;
  • //Runnable中只有一个run方法,用于存储线程汇总运行的代码,被实现需要覆盖该方法,
  • public void run(){
  • //1,为什么要定义成死循环??又或者说是不是在知道循环次数是时就可以不定义成死循环了?
  • while(true){
  • //同步代码块
  • synchronized(this){
  • //用于检测程序的安全性,而sleep()方法中有可能引发一场,所以要用try..catch,否则编译出错.
  • //Thread.sleep()让线程进入睡眠,模拟现实中临时故障的发生
  • try{
  • Thread.sleep(10);
  • }
  • catch(Exception e){
  • System.out.println(e.getMessage());
  • }
  • if(ticket>0){
  • System.out.println(Thread.currentThread().getName()+"刚刚售卖完第"+ticket--+"张票");
  • }
  • }
  • }
  • }
  • }
  • public class TicketTest {
  • public static void main(String[] args){
  • Ticket tk=new Ticket();
  • /*创建四个线程,开了四个窗口,Thread类中有Thread(Runnable target)构造方法,当向该方法传递
  • Runnable接口的类对象时,创建的线程会直接调用类对象中的run()方法作为它的运行代码.*/
  • Thread t1=new Thread(tk);
  • Thread t2=new Thread(tk);
  • Thread t3=new Thread(tk);
  • Thread t4=new Thread(tk);
  • //给线程取名字,纯属好看
  • t1.setName("1号窗口");
  • t2.setName("2号窗口");
  • t3.setName("3号窗口");
  • t4.setName("4号窗口");
  • //使线程开始执行
  • t1.start();
  • t2.start();
  • t3.start();
  • t4.start();

评分

参与人数 1技术分 +1 收起 理由
张勇1993 + 1 很给力!

查看全部评分

1 个回复

倒序浏览
加上了synchronized 的代码,当有一个线程访问了,其他线程就无法访问,只有当当前线程访问结束,其他线程才能访问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马