(1)线程常用状态:
1.新生状态(New Thread)
在创建线程对象之后,尚未调用start()方法之前。这个线程就有了生命,此时线程仅仅是一个空对象,系统没有为期分配资源,此时只能 启动和终止线程,其他人和此操作都会引发异常。
2.可运行状态(Runnable)
在调用start()方法之后,系统为该线程分配除cpu外的所需资源,
这个线程就有了运行的机会,此时处于可运行状态,
在这个状态,该线程对象可能处于正在运行,
也可能尚未运行,对于只有一个cpu的机器而言,任何时刻只能有一个处于可运行状态的线程占用处理机制,此时系统真正运行线程的run()方法。
3.阻塞状态(Blocked)
一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态。阻塞状态是一种不可运行的状态,而处于这种状态的线程在得到一个特定的事件之后会转回可运行状态。
wait()
sleep
I/O
lock
4.死亡状态(Dead)
一个线程的run()方法运行完毕、stop()方法被调用或者在运行过程中出现未捕获异常时,线程进入死亡状态。
join()方法:阻塞指定的线程等另一个线程完成以后在继续执行。(当前在运行的线程被等待,新来的线程执行结束以后在执行原来的线程)
sleep()方法和yield()方法的区别:
sleep:使用当前线程进入被阻塞的状态 yield:将当前线程转入暂停执行的状态
sleep: 即使没有其他等待运行的线程,当前线程也会等待制定的时间 yield:如果没有其他等待执行的的线程,当前线程会马上符合执行
sleep:其它等待执行的线程的机会是均等的 yield:会将优先级相同或更高的线程运行
5.实现线程同步的方法
同步方法和同步块
synchronized
使用synchronized修饰的方法控制对类成员变量的访问,每一个实例对应已把锁,方法一旦执行,就独占该锁,直达该方法返回时才将该锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一个时刻对应每一个实例,其所有声明为synchronized的方法只能有一个处于可执行的状态,从而有效地避免了类成员变量的访问冲突。
1.新生状态(New Thread)
在创建线程对象之后,尚未调用start()方法之前。这个线程就有了生命,此时线程仅仅是一个空对象,系统没有为期分配资源,此时只能 启动和终止线程,其他人和此操作都会引发异常。
2.可运行状态(Runnable)
在调用start()方法之后,系统为该线程分配除cpu外的所需资源,
这个线程就有了运行的机会,此时处于可运行状态,
在这个状态,该线程对象可能处于正在运行,
也可能尚未运行,对于只有一个cpu的机器而言,任何时刻只能有一个处于可运行状态的线程占用处理机制,此时系统真正运行线程的run()方法。
3.阻塞状态(Blocked)
一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态。阻塞状态是一种不可运行的状态,而处于这种状态的线程在得到一个特定的事件之后会转回可运行状态。
wait()
sleep
I/O
lock
4.死亡状态(Dead)
一个线程的run()方法运行完毕、stop()方法被调用或者在运行过程中出现未捕获异常时,线程进入死亡状态。
join()方法:阻塞指定的线程等另一个线程完成以后在继续执行。(当前在运行的线程被等待,新来的线程执行结束以后在执行原来的线程)
sleep()方法和yield()方法的区别:
sleep:使用当前线程进入被阻塞的状态 yield:将当前线程转入暂停执行的状态
sleep: 即使没有其他等待运行的线程,当前线程也会等待制定的时间 yield:如果没有其他等待执行的的线程,当前线程会马上符合执行
sleep:其它等待执行的线程的机会是均等的 yield:会将优先级相同或更高的线程运行
5.实现线程同步的方法
同步方法和同步块
synchronized
使用synchronized修饰的方法控制对类成员变量的访问,每一个实例对应已把锁,方法一旦执行,就独占该锁,直达该方法返回时才将该锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一个时刻对应每一个实例,其所有声明为synchronized的方法只能有一个处于可执行的状态,从而有效地避免了类成员变量的访问冲突。