什么是线程
一个程序由多个进程构成,一个进程的执行过程中,会产生多个线程。线程之间可以共享相同的内存空间(包括数据和代码),并利用这些共享单元来实现数据交换,实时通信与必要的同步操作。
Thread类与Runnable接口
在java中,由java.lang.Thread类来实现线程
CPU所执行的代码,在构造Thread类时,传递给Thread对象。
CPU所处理的数据,在构造Thread类时,传递给Thread对象。
Runnable对象是指实现了java.lang.Runnable接口的任何对象,Runnable接口只有一个方法run()
这个run()方法实际上就是线程所需要执行的代码。
为了构造一个Thread类,可以向Thread()传递一个Runnable对象,这个Runnable对象就是线程所需要的代码和数据的封装。
要启动线程中的代码,需要执行Thread类的start()方法,则系统会在可能的情况下去执行run()方法中所规定的代码.
线程创建的两种方法
创建线程对象,要传递代码和数据。
通过继承Thread类创建线程
从Thread类中派生出一个新类,在其中加入属性和方法,同时覆盖run()方法。当创建这样一个派生类的新对象后,使用start()方法,即可启动线程
public class Test{
public static void main(String[] args){
Thread t = new MyThread();
t.start();
}
}
class MyThread extends Thread{
public void run(){
for(int i = 0 ; i < 100; i++){
System.out.println(" "+ i );
}
}
}
这种方法的缺点是只能继承一个类
通过向Thread()构造方法传递Runnable对象来创建线程
public class Test{
public static void main(String[] args){
MyTest mytest = new MyTest(100);
Thread thread = new Thread(mytest); //向Thread构造方法传递Ruuuable对象
thread.start();
}
}
class MyTest implements Runnable{ //实现了Runnable接口,承载了线程所需要的代码和数据
private int n;
public MyTest(int n){
this.n = n;
}
public void run(){ //run()方法中就是线程所需要的代码
for(int i = 0; i < n; i++){
System.out.println(" "+i);
try{
thread.sleep(500);
}catch(InterruptedException e){}
}
}
}
注意的是:
程序运行时,首先启动主函数线程,主函数线程结束,启动其他线程。
每个线程在执行完一次循环后,会休眠一段时间。
run()方法规定了线程所需要的任务,但一般不是直接调用run()方法,而是通过start()方法来启动线程。
Thread类中的sleep()方法,他表示线程等待(休眠)一定的时间,单位为毫秒。但休眠的时间一般不会严格等于所给定的时间。休眠过程中可能会被其他线程中断,所以要求捕InterruptedException异常
线程的状态和生命周期
- 新建
当一个Thread对象或其子类对象被new时,他就拥有了相应的内存空间和其他资源,但没有开始执行。 - 就绪
执行start()方法后,被放入线程队列排队等待执行,一旦轮到它来使用处理器资源时,即可脱了主线程来独立开始自己的生命周期。
原来阻塞的线程被解除阻塞后也将进入就绪状态。 - 运行
就绪状态的线程被调度并获得处理器资源时,便进行运行状态。当线程对象被调度执行时,它将自动调用本对象的run()方法。 - 阻塞
一个正在执行的线程在某些特殊情况下(如被人为挂起或需要执行费时的输入/输出操作时),它将让出CPU并暂时中止自己的执行,进入阻塞状态。
只有引起阻塞的原因被消除,线程才能进入就绪状态,重新进入到线程队列里等待CPU资源。 - 死亡
处于死亡或终止状态的线程不具1有继续运行的能力。
线程类的主要方法
sleep(); 线程休眠
join(); 合并线程
destory(); 销毁线程
yield(); 暂停线程
挂起线程
- sleep();方法 需要捕捉InterruptedException异常
- yield();方法 暂停当前线程,并将其放入可运行队列
- interrupt()方法 一个线程运行时,另一个线程调用相对应Thread类中的Interrupt()方法来中断他
- wait()方法 使线程进入等待状态 直至被另一个线程唤醒
- join()方法 将几个并行的线程合并成单线程