黑马程序员技术交流社区

标题: 多线程 下 [打印本页]

作者: 柒月份的尾巴丶    时间: 2016-7-30 00:20
标题: 多线程 下
3.Thread类中的方法:
  currentThread():静态方法,返回当前线程对象,该方法通过Thread调用,Thread.currentThread()
                  方法在哪个线程中执行,就返回该线程对象
  getName():通过线程对象调用,获取该线程名称(主线程默认是main,新开辟的线程以编号顺延(Thread-0,Thread-1.....))
  
  sleep(long mills):让线程在执行的毫秒数休眠,如果线程休眠,CPU切换其它线程执行
                    当醒来后,该线程CPU重新切换到(该线程重新获取CPU的执行权),才能接着Thread.sleep(毫秒之值);
                    继续向下执行,如果sleep()方法在同步代码块中中使用,当执行该方法,不会释放锁
4.多线程安全问题:
          a. public class Demo_02Ticket implements Runnable {
                // 成员位置,定义100张票
                private int tickets = 100;
                // Lock lock = new ReentrantLock();
                private Object obj = new Object();

                public void run() {
                        while (true) {
                     if (tickets > 0) {
                                     try {
                                                Thread.sleep(10);  //以一种错误分析:
                                                                   //①当tickets=1 CPU切换到 Thread-0 执行 Thread.sleep(10); Thread-0睡眠
                                                                  //②CPU切换到 Thread-1 tickets>0 执行 Thread.sleep(10);Thread-1睡眠
                                             //③CPU切换到 Thread-2 tickets>0  执行 Thread.sleep(10); Thread-2睡眠

                                          } catch (InterruptedException e) {
                                                e.printStackTrace();
                                          }
                                                System.out.println(Thread.currentThread().getName() + " 出售第 " + tickets--);//④CPU 切换Thread-0 ,此时Thread-0睡醒,继续向下执行
                                         }                                                                                 //tickets--先使用,后自减,先打印1,tickets=tickets-1;tickets=0
                                                                                                                           //⑥CPU切换到Thread-1,此时Thread-1睡醒,继续向下执行
                                }                                                                                      //tickets--先使用,后自减,先打印0,tickets=tickets-1;tickets=-1
                        }                                                                                                                                                                                        //⑦CPU切换到Thread-2,此时Thread-2睡醒,继续向下执行
                }                                                                                      //tickets--先使用,后自减,先打印-1,tickets=tickets-1;tickets=-2
          }                                                                                          
          
         
          public static void main(String[] args) {
                        Demo_02Ticket ticket = new Demo_02Ticket();
                        Thread t0 = new Thread(ticket);
                        Thread t1 = new Thread(ticket);
                        Thread t2 = new Thread(ticket);
                       
                        t0.start();
                        t1.start();
                        t2.start();       
        }
  产生问题原因:Thread-0操作共享数据(tickets),操作了一半,结果CPU切换到另外一个线程执行,可能导致共享数据错误




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2