多线程

    xiaoxiao2021-04-14  67

    1.多线程的概念:如果希望程序中实现多段代码交替运行的效果,则需要创建多个线程。多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。

    2多线程的两种实现方式:

    (1)继承Thread,重写里面run方法

    (2)实现Runnable 接口, 实现了Runnable接口的对象

    3.线程的类型:

    1)主线程:当一个程序启动时,就有一个进程被操作系统创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread)。每个进程至少都有一个主线程,主线程通常最后关闭。

    2)子线程:在程序中创建的其他线程,相对于主线程来说就是这个主线程的子线程。

    3)守护线程:daemon thread,对线程的一种标识。守护线程为其他线程提供服务,如JVM的垃圾回收线程。当剩下的全是守护线程时,进程退出。

    4.线程的静态方法:Thread.sleep(long mi); //线程休眠

    Thread.currentThread; //当前线程

    Thread.yield();//线程让步

    5.对象方法 : t = new Thread();//创建一个线程对象

    t.start() ; // 开启线程

    t.getName(); //获取当前线程的名字

    t.getPriority(); //优先级[110](默认值为5

    t.setDaemon(true) ; //设置守护线程GC:垃圾回收器,它是一个守护线程,一般的Thread都是用户线程

    t.join(); // t加入到默认线程

    6.线程项目:小球

    解决闪屏问题:将小球画在一个图片上,然后把这个图片画在窗体上

         第一步:创建一张图片

        Image img = createImage(getWidth(), getHeight());

       第二步: 图片上画小球,首先要拿到图片的笔

        Graphics img_g = img.getGraphics();

        img_g.fillOval(x, y, 100, 100);

        第三步:把图片画到窗体,窗体的笔参数g

        g.drawImage(img, 0, 0, null);

    小球线程类

    新建一个Ball 类 实现runnable接口

    封装 属性

    run方法里面 一直执行 while true必须sleep

    runnable 线程必须结合 Thread开启

    注意:明确创建小球(new )的时机,避免空指针异常

    创建小球后,在窗体中重写父类的paint里面绘画

    先设置笔的颜色,然后画小球

    7.线程安全问题:线程安全的约束是指一个函数被多个并发线程反复调用时,要一直产生正确的结果。要保证线程安全,主要是通过加锁的方式保证共享变量的正确访问。

    线程安全对共享变量互斥访问。当多个线程类并发操作某类的某个方法,来修改这个类的某个成员变量的值,不会出错,则我们就说,该的这个方法是线程安全的。

    某类的某方法是否线程安全:

    (1) 该方法是否修改该类的成员变量;

    (2) 是否给该方法加锁(是否用synchronized关键字修饰)。

    产生原因:多个线程,修改公共的资源、变量,多行代码

    解决办法:

    同步代码块

    synchronized(对象){同步代码块}

    每个对象有个标志位 1(开)2(关)

    参数对象起到了锁的作用,叫对象锁

    {…}代码块在synchronized的代码块叫同步代码块

    同步方法

    普通方法:同步方法的对象锁是this,代表当前对象

    静态方法:同步方法是当前类

    8.死锁问题:所谓死锁,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。

              产生原因:锁的嵌套,多个线程相互把持锁互不相让

               解决方法:让所有的线程按照同样的顺序获得一组锁。将多个锁组成一组并放到同一个锁下。将那些不会阻塞的可获得资源用变量标志出来。

    public classDeadLockThread implements Runnable {

                                       Stringname;

                                       staticObject Chopsticksone =new Object();// 第一个筷子的锁对象

                                       staticObject Chopstickstwo =new Object();// 第二个筷子的锁对象

     

                                       publicDeadLockThread(String name) {

                                              this.name= name;

                                       }

     

                                       publicvoid run() {

                                              if("Lq".equals(name)) {

                                                     synchronized(Chopsticksone) {//Chopsticksone锁对象上的同步代码块

                                                            System.out.println(name+ "拿到第一个筷子");

                                                            synchronized(Chopstickstwo) {//Chopstickstwo锁对象上的同步代码块

                                                                   System.out.println(name+ "拿到第二个筷子");

                                                            }

                                                     }

                                              }else {

                                                     synchronized(Chopstickstwo) {

                                                            System.out.println(name+ "拿到第二个筷子");

                                                            synchronized(Chopsticksone) {

                                                                   System.out.println(name+ "拿到第一个筷子");

                                                            }

                                                     }

                                              }

                                       }

     

                                       publicstatic void main(String[] args) {

                                              DeadLockThreadd1 = new DeadLockThread("Lq");

                                              newThread(d1).start();

                                              DeadLockThreadd2 = new DeadLockThread("hs");

                                              newThread(d2).start();

                                       }

    9.单例模式(恶汉,懒汉)

    public static Singleton getInstance2() {

    return instance2;

    }

     

    private static Singletoninstance;

     

    public static Singleton getInstance() {

    if (instance ==null) {

    synchronized (Singleton.class) {

    if (instance ==null) {

    instance = new Singleton();

    }

    }

    }

    return instance;

    }

    转载请注明原文地址: https://ju.6miu.com/read-670413.html

    最新回复(0)