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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 柒月份的尾巴丶 中级黑马   /  2016-7-30 00:20  /  321 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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切换到另外一个线程执行,可能导致共享数据错误

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马