线程的两种实现方法:继承Tread类和实现Runable接口。
线程
线程(thread)是控制线程(thread of control)的缩写。
线程有:自己的方法代码,方法中定义的局部变量(栈中),共享数据。
线程是独立的,局部变量不能被其他线程访问,若两个线程同时访问同一个方法,每个现在讲各自得到属于自己的一份该方法的拷贝。
继承Thread类创建线程
1.自定义类ThreadType继承Thread类,在类中覆写Thread类的run()方法(Thread类中run为空方法,什么都不做)。
2.创建线程类对象 ThreadType tt=new ThreadType();
3.启动新线程 tt.start()。 新线程会自动调用run()方法。start方法不等run()执行完毕就返回了。
实现Runable接口创建线程
1.自定义类ThreadType实现Runable接口,在类中覆写Runable接口的run()方法(run方法由Runable提供)
2.创建Runable变量指向ThreadType对象 Runable rb=new ThreadType();
3.创建线程类对象 Thread td=new Thread(rb);//通过Thread类的来创建线程类对象
4.启动新线程 td.start()
线程周期
一个线程有4种状态:
new 新建。new后,start之前。可以用start进入启动状态,也可stop进入退出状态。
runnable 可运行。start之后。可运行状态不一定就在运行,取决于优先级和系统调度。
non runnable 不可运行。线程被挂起或发生阻塞。使用resume,notify或notifyAll可使其到可运行状态。
done 退出。调用stop()或者run()结束会自动到done状态。 done状态无法返回到其他状态。
当程序所有线程均处于done状态,程序会被强制终止。
线程状态转换函数
start() new--runnable
stop() new/runnable--done 容易在虚拟机引起“死锁”,不建议使用。建议等自然终止
suspend()挂起 runnale--non runnable 容易在虚拟机引起“死锁”,不建议使用。建议sleep()或wait()
resume()恢复 non runnale--runnable 容易在虚拟机引起“死锁”,不建议使用。建议sleep()或wait()
sleep()暂停 runnable--non runnable--runnable sleep(long)毫秒,sleep(long,int)纳秒
wait()阻塞 runnable--non runnable--runnable
notify()解除阻塞 non runnable--runnable
yield()明确放弃执行 runnale--runnable
线程状态转换
线程进入runnable
1.其他线程调用notify()或者notifyAll(),唤醒non runnable状态的线程
notify()唤醒一个线程并允许它获得锁,notifyAll()唤醒所以等待这个对象的线程并允许它们获得锁。
2.线程调用sleep(),到时间后自动进入runnable状态。
3.线程对I/O操作的完成。
线程进入runnable
1.线程调用wait()。只有其他线程调用notify()或者notifyAll(),才会获得锁和被唤醒,然后改线程一直等待重新获得对象锁才继续执行。
2.线程调用sleep()的等待时间段。
3.线程等待I/O操作的完成。
|
|