一、多线程
1.多线程的常用方法
-
start():①启动线程②调用线程的run()
-
run():将线程要执行的操作声明在run()中
-
currentThread():获取当前代码执行对应的线程
-
getName():获取线程名
-
setName():设置线程名
-
sleep(long millis):静态方法,调用时可以使得当前线程睡眠的毫秒数
-
yield():一旦执行该方法,就会释放CPU的执行权(静态方法)
-
join():在线程a中通过线程b调用join(),意味着线程a进入阻塞状态,直到线程b执行结束,线程a才结束阻塞状态继续执行
-
isAlive():判断当前线程是否存活
其他方法(不太建议使用):
-
stop():强行结束一个线程的执行,直接进入死亡状态
-
void suspend()/ void resume():可能造成死锁
2.线程的优先级
Thread类内部优先级有三个常量:
-MAX_PRIORITY(10):最高优先级
-MIN_PRIORITY(1):最低优先级
-NORM_PRIORITY(5):普通优先级,默认情况下main具有普通优先级
3.多线程的生命周期
新建(New)、就绪(Runnable)、运行(RUNNINg)、阻塞(Blocked)、死亡(Dead)。
4.解决线程的安全问题
1.同步代码块
synchronized(同步监视器this/odj【可以使用static方式保证唯一性】...)
{
//需要被同步的代码
}
说明:①需要被同步的代码即为操作共享数据的代码;
②共享数据即为多个线程都需要操作的数据;
③需要被同步的代码在被synchronized包裹之后,就使得一个线程在操作这些代码的过程中,其他线程必须等待。
④同步监视器俗称锁,哪个线程获得了锁哪个线程就能执行需要被同步的代码。
⑤同步监视器可以使用任何一个类的对象充当,但是多个线程必须共用同一个同步监视器。
注意:①在实现Runnable接口中,同步监视器可以考虑使用this;
②在继承Thread类方式接口中,同步监视器需要慎用this。
2.同步方法
如果操作共享数据的代码完整的声明在了一个方法中,那么可以将此方法声明为同步方法即可。
public synchronized void show()//非静态,此时同步监视器为this
{
//需要被同步的代码
}
public static synchronized void show()//静态,此时同步监视器为当前类本身,是唯一的
{
//需要被同步的代码
}
3.synchronized的好处&弊端
好处:解决了线程的安全问题
弊端:在操作共享数据时,多线程其实是串行执行,性能低。