【多线程】

今日内容
    多线程

Thread类
    常用构造方法
        Thread()
        Thread(String name)
        Thread(Runnable r)
        Thread(Runnable r,String name)
    常用方法
        void setName(String name):设置线程的名字,如果没有设置线程名字,会有一个默认名字,Thread-x,x从0开始依次递增
        String getName():获取线程的名字
        static Thread currentThread():获取当前线程的对象(线程创建的第二种方式一定会用这个方法)
        static void sleep(long millis):让线程休眠,传递的是毫秒值


    实现多线程的第二种方式:实现Runnable接口
        步骤:
            (1)自定义一个类实现Runnable接口
            (2)重写Runnable接口中的run 方法
                public void run() {

                }
            (3)在测试类的主方法中创建自定义类的对象
            (4)创建Thread类的对象,传递自定义类对象到构造方法中
            (5)使用Thread类的对象调用start方法启动线程

        // (1)自定义一个类实现Runnable接口
        public class MyThread implements Runnable {
            // (2)重写Runnable接口中的run 方法
            @Override
            public void run() {

            }
        }

        //
        public class Test {
            public static void main(String[] args){
                // (3)在测试类的主方法中创建自定义类的对象
                MyThread mt = new MyThread();
                // (4)创建Thread类的对象,传递自定义类对象到构造方法中
                Thread th = new Thread(mt);
                // (5)使用Thread类的对象调用start方法启动线程
                th.start();
            }
        }

    继承Thread类和实现Runnable接口的区别
       继承Thread类
            弊端:(1)Java单继承的局限性,如果一个类已经有了父类,不能使用这种方式
                 或者说如何这个类已经继承了Thread类,就不能再继承其他类
                  (2)扩展性较差,耦合性较强

            优点:直接继承Thread类,就变成了Thread类的子类,Thread类中的方法可以直接使用
                使用比较方法

       实现Runnable接口
            优点:(1)解决单继承的局限性,即使有了父类也可以使用这种方式
                或者说使用这种方式,不影响它继续去继承其他类
                  (2)提高了程序的扩展性,降低了耦合性

            弊端:
                不能直接使用Thread类中的方法,如果要使用,必须先获取到当前线程对象(currentThread())
                然后再调用反复,使用稍复杂

    线程安全问题
        出现的原因
            多个线程执行共享代码,而且共享的代码有多段

        线程安全问题的解决
            同步代码块
                格式:
                    synchronized(锁对象){

                    }

                    锁对象可以是任意对象,但是必须保证多个线程使用的是同一个锁对象
                    哪个线程获取了锁,哪个线程才能执行同步代码中的方法,而且同一时刻
                    只能有一个线程获取锁,如果锁已经被别的线程拿到了,其他的线程就不能
                    再拿到了,必须等之前的线程把锁释放才能再去抢锁,所以同步代码块能够
                    保证代码块中的代码永远同一时刻只被一个线程执行

                位置:
                    方法中
                作用:
                    解决线程安全问题


            同步方法
                用synchronized关键字修饰的方法

                非静态同步方法
                    默认锁是this
                静态同步方法
                    默认锁是当前类的字节码对象(类名.class)

            Lock锁
                JDK1.5出现

        Java中的代码块(四种)
            静态代码块
            同步代码块
            构造代码块
            局部代码块


今日重点:
    (1)创建线程的第二种方式
    (2)说出线程安全问题产生的原因,以及线程安全问题的解决,使用同步代码块的方式

猜你喜欢

转载自blog.csdn.net/L531003231/article/details/81747991