Java多线程
一、线程
线程:可以并发执行多个任务。
二、线程创建方式
线程有两种创建方式。
方式一:直接继承Thread并重写run方法。需要注意,启动线程要调用start方法,start方法调用完毕后,线程纳入到线程调度中,线程调度会分配CPU时间片来运行该线程,当线程运行时会自动调用run方法。
第一种创建线程方式有两个不足:
1:由于要求继承Thread类,那么在将来项目中,就有可能出现继承冲突。
2:由于继承了Thread后需要重写run方法来定义线程要执行的任务,这就导致线程与任务有一个强耦合关系,当前线程就只能做run方法中定义的任务,其他事情做不了,这不利于线程的重用。
第二种创建线程的方式
定义一个类并实现Runnable接口来单独定义线程要执行的任务。
此外,还可以使用匿名内部类实现两种创建线程的方式。
三、相关API
Thread提供了一个静态方法static Thread currentThread(),该方法是用来获取运行这个方法的线程。 java中所有的代码都是由线程运行的,当需要获取某个线程时,只需使它执行上述方法即可。在哪个方法中定义代码,获取的就是运行该方法的线程。
Long getId();线程ID
String getName();获取名字
int getPriority();查看优先级
boolean isAlive();是否活着
boolean isDaemon();是否为守护线程
boolean isInterrupted();是否被中断了
四、操作线程
(1)线程的优先级
线程不能干涉线程调度的工作,即:线程不能决定时间片分配给哪个线程,也不能决定分配的具体次数。但是可以通过改变线程的优先级来获取更高的CPU时间片几率。线程优先级分为10个等级,对应数字为1-10,其中1最低,5默认,10最高。理论上优先级越高的线程,获取CPU时间片的次数多。
(2)线程的休眠
Thread提供了静态方法 static void sleep(long ms),该方法会将执行该方法的线程进入阻塞状态执行的毫秒数,在该毫秒数内不会进入就绪状态,醒来后并不能保证进入运行状态,只能保证进入就绪状态。
(3)线程的加入
void join(),线程提供了一个方法join,该方法允许一个线程在另一个线程上等待,直到它的工作都结束,才继续当前线程的后续工作。否则一直处于阻塞状态。
(4)线程的中断
可以使用Thread类中的interrupt()方法使线程离开run()方法。
(5)线程的同步
线程安全问题来源于两个线程同时存取单一对象的数据。
当一个方法被synchronized修饰后,该方法称为"同步方法",意思是说当前方法不能同时被两个以上的线程执行。多线程并发安全问题的本质就是多个线程发生了"抢"的
情况。有效缩小同步范围可以在保证并发安全的前提下提高并发效率。
同步块需要指定同步监视器(上锁的对象),若希望该同步块有效果,必须保证多个线程看到的锁对象相同,通常使用this即可。
互斥锁
synchronized修饰的是两段代码,但是锁对象相同。那么这两段代码就是互斥的。
<!--EndFragment-->