论坛首页 Java企业应用论坛

java面试必备之多线程

浏览 2016 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2016-09-12  

     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-->
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics