JAVA线程之六:线程的生命周期及死锁
一,线程的四个主要周期状态是“创建”,“可执行”,“非可执行”,“消亡”,状态转换关系如下图:
(1)创建。当实例化一个thread对象并执行start()方法后,线程进入“可执行”状态开始执行。虽然多线程给用户一种同时执行的假象,但事实上在同一时间点内,只有一个线程在执行,只是线程之间切换的动作非常快,所以看起来跟同时执行一样。
(2)可执行。当线程启用start()方法之后,进入“可执行”状态,执行用户覆写的run方法。当一个线程进入“可执行”状态下,并不代表它可以一直执行到run()结束。因为事实上它只是加入此应用程序执行安排的队列中,正在等待分享CPU资源,也就是等候执行权,在何时给予线程执行权,则由JAVA虚拟机决定,同时也由线程的优先级决定。
(3)非可执行。在“可执行”状态下,线程可能执行完毕;也可能没有执行完毕,处于等待执行权的队列中,此时线程进入“非可执行”状态。可以使用thread类中的wait(),sleep()方法使线程进入“非可执行”状态。
当线程进入“非可执行”态,CPU就不分配时间片给这个线程。若希望线程回到“可执行”状态下,可以使用notify()方法、notifyAll()方法以及interrupt()方法。
(4)消亡。当run方法执行完毕后,线程自动消亡,也就是run()执行完毕后,该thread会自动终止。
二,关于多线程产生死锁
因为线程可以阻塞,并且有同步控制机制可以防止其他线程在锁还没有释放的情况下访问这个对象,这时就产生了矛盾。比如:线程A在等待线程B,线程B又在等待线程A。这样就造成了死锁。
造成死锁必须同时满足的4个条件:
(1)互斥条件。线程使用的资源必须至少有一个是不能共享的。
(2)请求与保持条件。至少有一个线程必须持有一个资源并且正在等待获取一个当前被其他线程持有的资源。
(3)非剥夺条件。分配的资源不能从相应的线程中被强制剥夺。
(4)循环等待。第一个线程等待其他线程,后者又在等待第一个线程。
这四个条件同时满足时,才会导致死锁。所以要防止死锁的话,只需呀破坏其中一个条件即可。
相关文档:
/////////////////////DogTestDrive/////////////////////
class DogTestDrive {
public static void main(String[] args) {
Dog one = new Dog();
one.size = 70;
Dog two = new Dog();
two.size = 8;
......
一、创建型模式
FACTORY?人才市场:以往是要哪个人才,就找哪个人才,效率低,现在有了人才市场,我们只需直接去人才市场挑一个好了;
BUILDER?生产流水线:以前是手工业作坊式的人工单个单个的生产零件然后一步一步组装做,好比有了工业革命,现在都由生产流水线代替了。如要造丰田汽车,先制定汽车的构造如 ......
客户端:
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.awt.*;
public class ClientPoint extends JFrame implements ActionListener,KeyListener{
static int SERVERPORT=8088;
sta ......
Java Arrays中提供了对所有类型的排序。其中主要分为primitive和Object两大类,分别使用了快速排序与合并排序。本章以int[] 的排序,讲解Java对primitive排序。
首先大家要了解什么是快速排序,它有什么优点,这些我就不累述了,给出地址。http://zh.wikipedia.org/zh/%E5%BF%AB%E9 ......
题目:有600个苹果,要求分装在10个盒子中。对于顾客要求的任意苹果数都可以通过此10个盒子进行组合得到。
分析:1、首先要设计10个盒子所装苹果的数目。由二进制与十进制的转换可知,2的倍数相加可以的到一切十进制数。所以如果想使用有限的数字组合得到一定范围内的所有数字必是以2的倍数进行设计的。所以,可知十个盒子 ......