线程
程序执行过程中,并发执行的代码段.
线程之间可以共享内存.
线程安全
增加了同步处理,确保在同一时刻,只有一个线程执行同步代码.
保证线程安全的方法就是锁机制 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执行权,不释放锁
守护线程案例
有两个玩家和一个服务员 玩家在玩的过程中 服务员需要每隔一秒报时 当玩家退出后 服务员也退出
在这里 服务员的线程就是守护线程(为其它线程提供服务的线程) 当玩家玩完后就设置其线程为守护线程 如果所有的线程都是守护线程
程序就会自动退出.
多线程&线程同步