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)循环等待。第一个线程等待其他线程,后者又在等待第一个线程。
这四个条件同时满足时,才会导致死锁。所以要防止死锁的话,只需呀破坏其中一个条件即可。
相关文档:
先来了解一下链表模式的原理:
首先写一个JavaBean,内容是要添加的元素和该元素的节点。
public class NodeBean implements Serializable
{
private Object data; //元素本身
private NodeBean next; //下一个节点
&n ......
1.局部变量在使用的时候必须已经被初始化
2.byte b=2,e=3
byte c=b+c; 会编译不通过,应为b+c会自动 类型提升位int 如果想得到 byte c 必须强制转型 byte c=(byte)b+c;
3.f ......
java连接常见数据库的连接字符串
1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar ;
Class.forName( "org.gjt.mm.mysql.Driver" );
cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd );
2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar ;
C ......
package com.color.program;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CompareTime {
public static void main(String[] args){
String t1 = "2008-05-09";
String t2 = "20 ......