多线程
多线程的实现方式:
1.继承Thread类
第一步:定义一个Thread类
第二步:重写run方法,将需要执行的代码写入到run方法里
第三步:创建Thread的子类对象
第四部:调用start()方法
2.实现Runnable接口
第一步:定义一个类 实现Runnable接口
第二步:重写run方法,将需要执行的代码写入到run方法里
第三步:创建Runnable的子类对象
第四步:创建Thread类的对象,将Runnable的实现类对象传递给它
第五步:调用start()方法
获取线程名称的方法:
1.使用Thread类的getName()方法
String getName() 返回该线程的名称
2.可以先获取到当前正在执行的线程
static Thread currentThread() 返回当前正在运行的线程对象的引用
实现Runnable接口创建多线程的好处:
1.避免了类的单继承的局限性
一个类只能继承一个类,类继承了Thread类就不能继承其他类,实现Runnable接口可以继承其他的类,实现其他的接口
2.增强了程序的扩展性,降低了程序的耦合性
实现Runnable接口,把设置线程的任务和开启线程进行了分离(解耦)
实现类中重写了run方法用来设置线程任务,创建Thread类对象,调用start()方法用来开启新线程
同步代码块:
定义在线程中,用来保证数据的安全性
格式:synchronized(锁对象){
可能会出现线程安全问题的代码
}
注意:
1.代码块中的锁对象可以是任意的对象
2.必须保证多个线程使用的都是同一个锁对象
3.锁对象的作用是把同步代码块锁住,保证只有一个线程在同步代码块内执行
线程的6种状态:
新建、阻塞、运行、计时等待、无限等待、死亡
等待:
void wait():在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前的线程处于等待状态
当一个线程处于等待的时候,会释放锁所占用的资源,让别的线程可以抢占资源
唤醒:
void notify():唤醒在此对象监视器上等待的单个线程,会继续执行wait()后面的代码
void notifyAll():唤醒在此对象监视器上等待的所有线程
wait()和notify()两个方法必须使用在同步代码块中,而且使用同步锁对象才能够调用
睡眠:
void sleep(long millis):是当前正在执行的线程以指定的毫秒数进行休眠(暂时停止执行)。等指定的毫秒数结束后,该线程恢复运行。