线程有四种状态
任何一个线程肯定处于这四种状态中的一种
) 产生(New)线程对象已经产生但尚未被启动所以无法执行如通过new产生了一个线程对象后没对它调用start()函数之前
) 可执行(Runnable)每个支持多线程的系统都有一个排程器排程器会从线程池中选择一个线程并启动它当一个线程处于可执行状态时表示它可能正处于线程池中等待排排程器启动它也可能它已正在执行如执行了一个线程对象的start()方法后线程就处于可执行状态但显而易见的是此时线程不一定正在执行中
) 死亡(Dead)当一个线程正常结束它便处于死亡状态如一个线程的run()函数执行完毕后线程就进入死亡状态
) 停滞(Blocked)当一个线程处于停滞状态时系统排程器就会忽略它不对它进行排程当处于停滞状态的线程重新回到可执行状态时它有可能重新执行如通过对一个线程调用wait()函数后线程就进入停滞状态只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态 class Object下常用的线程函数
wait()notify()和notifyAll()这三个函数由javalangObject类提供用于协调多个线程对共享数据的存取
) wait()函数有两种形式第一种形式接受一个毫秒值用于在指定时间长度内暂停线程使线程进入停滞状态第二种形式为不带参数代表waite()在notify()或notifyAll()之前会持续停滞
) 当对一个对象执行notify()时会从线程等待池中移走该任意一个线程并把它放到锁标志等待池中当对一个对象执行notifyAll()时会从线程等待池中移走所有该对象的所有线程并把它们放到锁标志等待池中
) 当调用wait()后线程会释放掉它所占有的锁标志从而使线程所在对象中的其它synchronized数据可被别的线程使用
例
下面我们将对例中的例子进行修改
class TestThreadMethod extends Thread{
public static int shareVar = ;
public TestThreadMethod(String name){
super(name)
}
public synchronized void run(){
if(shareVar==){
for(int i=; i<; i++){
shareVar++;
if(shareVar==){
try{
thiswait() //()
}
catch(InterruptedException e){}
}
}
}
if(shareVar!=){
Systemoutprint(ThreadcurrentThread()getName())
Systemoutprintln( shareVar = + shareVar)
thisnotify() //()
}
}
}
public class TestThread{
public static void main(String[] args){
TestThreadMethod t = new TestThreadMethod(t)
TestThreadMethod t = new TestThreadMethod(t)
tstart() //()
//tstart() ()
tstart() //()
}}
运行结果为
t shareVar =
因为t和t是两个不同对象所以线程t调用代码()不能唤起线程t如果去掉代码()的注释并注释掉代码()结果为
t shareVar =
t shareVar =
这是因为当代码()的线程执行到代码()时它进入停滞状态并释放对象的锁状态接着代码()的线程执行run()由于此时 shareVar值为所以执行打印语句并调用代码()使代码()的线程进入可执行状态然后代码()的线程结束当代码()的线程重新执行后它接着执行for()循环一直到shareVar=然后打印shareVar