多线程问题及其解决方法


进程:就是一个应用程序。
线程:CUP的切换执行线

创建多线程的三种方式:继承,实现,匿名对象。推荐实现runnable接口,单继承,多实现

用户线程,没有做其它操作,就是直接创建的线程。
守护线程,可以对线程new Thread().setDaemon(true);当主线程执行完成后,守护线程也立即结束。
        -- 主线程就是程序在运行的标致,当主线程结束,就是程序结束,程序结束所有的线程都可以停止。
        
多线程:有多个线程操作共享数据。

怎么解决线程安全问题!!!
    同步代码块(synchronized),同步方法(synchronized),Lock锁
    本源都是锁机制!!
    可能会有死锁问题:解决办法,死锁不能解决,只能避免出现死锁。
    怎么不出死锁?不要在锁里面再加锁。

    状态:
        1.创建,没有调用start。
        2.调用了start.就可以开始运行线程了。就有两个情况:有CUP的执行权,和没有执行权。
        3.sleep - 睡一会儿,有定时的,定时阻塞。
        4.wait - 等一会儿,没有定时的,等别通知可以不等了,就继续运行。
        5.可以执行,但是没有锁权限(没有钥匙)
        6.线程运行完,线程结束死亡。

    wait与sleep区别

    - 对于sleep()方法,首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
    - sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
      wait()是把控制权交出去,然后进入等待此对象的等待锁定池处于等待状态,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
    - 在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁。

结束线程:1.线程执行完成,就结束。2.使用interrupt()方法中断线程。3.stop方法。
    使用interrupt:当前线程在等待,别的线程不想让这个线程继续等下去,就把它给关了。
    
想让一个线程优先执行!!
    优先级priority 1 -10 越大,优先级越高。
    abc.join():抢当前线程的执行权,先执行abc线程,再执行当前线程。
    abc.yield():让出一次CPU的执行权。
    
多线程特性:1.原子性。2.可见性。3.有序性。

你可能感兴趣的:(多线程)