线程

    程序执行过程中,并发执行的代码段.

    线程之间可以共享内存.


线程安全

    增加了同步处理,确保在同一时刻,只有一个线程执行同步代码.

    保证线程安全的方法就是锁机制 java中的任何对象都可以作为锁对象 

        synchronized(lock){....} 代码块中的代码被确保同一时间只有一个线程才能执行

    同步方法是用当前对象作为同步对象(this)

        public synchronized int getTicket(){...} synchronized关键字也能加在方法上 确保同一时间只有一个线程才能访问该方法

    静态方法可以加同步处理,使用class作为同步对象.


创建线程方式

    继承Thread类

    1.子类覆盖父类中的run方法,将线程运行的代码存放在run中.

    2.建立子类对象的同时,线程也被创建.

    3.通过调用start方法开启线程.     

    Thread.currentThread() //得到当前的执行线程

    yield() //让线程放弃cpu的抢占权                                                                                                                       

    sleep(int 毫秒数) / 让线程休眠指定的毫秒数

同步的前提

   1.同步需要两个或者两个以上的线程.

    2.多个线程使用的是同一个锁.

    未满足以上两个条件,不能称其为同步.

同步的弊端

    当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率.

线程间通信

    思考1:wait(),notify(),notifyAll(),用来操作线程为什么定义在了Object类中?

        1.这些方法存在于同步代码中.

        2.使用这些方法时必须要标识所属的同步锁

        3.锁可以是任意对象,所以任意对象调用的方法一定定义在Object类中.

    思考2:wait(),sleep()有什么区别?

        wait():释放cpu执行权,释放锁

        sleep():释放cpu执行权,不释放锁

    

守护线程案例

    有两个玩家和一个服务员 玩家在玩的过程中 服务员需要每隔一秒报时 当玩家退出后 服务员也退出

在这里 服务员的线程就是守护线程(为其它线程提供服务的线程) 当玩家玩完后就设置其线程为守护线程 如果所有的线程都是守护线程

程序就会自动退出.

wKiom1cpwhmzjz8vAAA-0u8eKLw638.png


wKioL1cpwxPg_kGCAAA7ZM9-V18006.png

wKioL1cpw27QT3isAAA1Rp51ktg011.png