黑马程序员技术交流社区

标题: 【成都校区】关于多线程的初步认识 [打印本页]

作者: 法兰的街舞队    时间: 2018-11-22 13:00
标题: 【成都校区】关于多线程的初步认识
1.1多线程
        Thread:
                void setName(String name)设置线程名称
                String getName()获取线程名称
                start()开启新的线程,并在新线程中调用run方法

                static void sleep(long millis)对应线程睡眠指定毫秒值
                static Thread currentThread()获取当前正在执行对应代码的线程

        线程的开启方式1:
                1.定义类继承Thread
                2.重写run方法
                3.创建Thread的之类对象
                4.调用start方法开启线程
        线程的开启方式2:
                1.定义一个类,实现Runnnable接口
                2.重写接口中的run方法
                3.创建Runnable的实现类对象
                4.创建一个Thread对象,并把Runnable的实现类对象当作构造的参数传递进去
                5.调用start方法开启线程

        对两种开启线程方式的比较:
        实现方式1:
                实现起来相对简单
        实现方式2:
                耦合性:代码和代码之间的关联性
                实现方式2:将在线程中执行的代码和线程开启,设置线程名称功能分离
         编程的原则:高内聚,低耦合

         实现Runnable接口创建多线程程序的好处:
                1.避免了单继承的局限性
                       一个类只能继承一个类,类继承了Thread类就不能继承其他的类了
                       实现了Runnable接口,还可以继承其他类,实现其他的接口
                2.增强了程序的扩展性,降低了程序的耦合性(解耦)
                        实现了Runnable接口的方式,把设置线程任务和开启线程任务进行了分离(解耦)
                        实现类中,重写了run方法:用来设置线程任务
                        创建Thread类对象,调用Start方法:用来开启程序
         用匿名内部类改进代码
                匿名内部类:
                        格式:
                                new 父类/福接口(){
                                        重写父类的方法
                                        };
                                匿名内部类本质就说父类/父接口的子类对象
                                将定义类和创建对象放在一起了

       *已经开启的线程不能被再次开启,

2.1同步技术:
        1.同步代码块:
                格式:
                        synchronized(锁对象){
                            需要被同步的代码(被上锁的代码)
                        }

                锁对象:可以是任意对象 举例:new Object
                        要求:对多线程来说,锁对象只能有一个

                        this  当当前类只有一个对象,此时使用this也可以
                        当前类.class/类对象,是独一无二的,也可以
                执行流程:
                        三个线程会抢夺锁对象,
                        如果其中有一个线程抢到了锁,这个时候整个同步代码块只能有一个线程执行
                        其他线程哪怕有CPU的执行权,都不能进入同步中
                        当抢到锁的线程执行完整个同步代码块,其他线程才有可能抢到锁

        2.同步方法
                在方法的修饰符上加上一个synchronized关键字
                整个方法都被同步了,某一个时刻只有一个线程在方法种执行

                同步方法有默认的锁对象
                        非静态同步方法:this
                        静态同步方法:

        同步方法3:
                lock锁:
                        lock:
                                lock()获取锁
                                unlock()释放锁
                                实现等待唤醒:
                                        Condition c=lock.newCondition();
                                        c.await()相当于等待
                                        c.signal()相当于唤醒




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