首页 > 技术文章 > JAVA—线程(Thread)

zucc-31701019 2020-04-15 16:18 原文

1.线程的状态有哪些

  我记得在操作系统原理的书上有一张具体的图,暂时找不到书...

  new:新建状态,被创建出来后未启动时的线程状态。

  runnable:就绪状态,表示可以运行。

  blocked:阻塞状态表示正在等待执行synchronized代码块或者方法。

  waiting:等待状态,指一个处于等待状态的线程正在等待另一个线程执行某个特定动作。

  timed_waiting:计时等待状态,比等待状态多了个超时时间。

  terminated:终止状态,线程已经执行完成。

 

2.阻塞和等待状态的区别

  阻塞状态可以理解为线程还处于活跃状态,不过在等待其他线程使用完某个锁资源,而等待状态是自身调用了wait()或者join()之类的函数,只能等待其他线程执行某个特定的动作才能被继续唤醒。

 

3.start()和run()的区别

  start()属于Thread自身的方法,并且用了synchronized关键字来保证线程安全。而run()为Runnable接口的抽象方法,必须重写。从执行效果来说,start()可以启动多个线程,而run()只是一个普通的方法。还有就是start()不能被多次调用,而run()可以。

 

4.线程优先级

线程的优先级可以理解为优先使用cpu时间片的概率,但不能保证高优先级线程一定先执行。在程序中我们可以通过Thread.setPrioity()设置优先级。

 

5.线程的其他常用方法

(1)join() 使当前线程的执行权让给别的线程,直到那个线程执行完成或者超过超时时间。

(2)yield() 给线程调度器一个当前线程愿意让出cpu使用权的信号,但是线程调度器不一定管。也就是有时候会让,有时候不让,不稳定。

 

 

6.sleep()和yield方法的区别

  (1)sleep使当前线程暂停指定时间,让出cpu使用权并且不考虑优先级,不释放锁同步锁,如果有synchronized关键字的同步块,别的线程还是不能访问。yield只会让位给优先级高于等于它的线程,不能指定时间,不能保证让出使用权,yield方法也不会释放同步锁。

  (2)线程在执行sleep之后进入睡眠状态,而执行yield后进入就绪状态。

  (3)sleep方法需要trycatch来抛出异常,yield不需要

推荐阅读