一、线程的实现方式:
1、继承java.lang.Thread类 (Thread类实际上实现了Runnable接口)
启动一个新线程需要建立一个Thread实例。
Thread常用构造方法:
1.1、public Thread(): 创建一个新的线程对象。
1.2、public Thread(String threadName): 创建一个名称为threadName的线程对象。
语法:public class ThreadTest extends Thread{}
当继承Thread类后,就在该类中覆盖run()方法。将实现该线程功能的代码写入run()方法中,同时调用Thread类中的start()方法执行线程。也就是调用了run()方法。
如果start()方法调用了一个已经启动的线程,系统将抛出IllegalThreadStateException异常。
2、实现java.lang.Runnable接口
使用场景:如过一个类要继承其他非Thread类又需要实现多线程,就可以通过Runnable接口实现。
*** 实质上Thread类实现了Runnable接口,其中run()方法正是对Runnable接口中的run()方法的具体实现。
实现方法一:步骤:
2.1.1、建立Runnable对象。
2.1.2、使用参数为Runnable对象的构造方法创建Thread实例。
2.1.3、调用start()方法启动线程。
public class SwingAndThread extends JFrame {
public SwingAndThread (){
t = new Thread(new Runnable(){
public void run(){
//功能代码
}
});
t.start();
}
}
*** 启动一个新线程,不是直接调用Thread子类对象的run()方法,而是调用Thread子类的start()方法,Thread类中的start()方法产生一个新的线程,该线程运行Thread子类的run()方法。
实现方法二:步骤:
2.2.1、定义类实现Runnable 接口
2.2.2、覆盖Runnable 接口中的run方法(将线程要运行的代码存放在该run方法中)
2.2.3、 通过Thread 类建立线程对象
2.2.4、将Runnale接口的子类对象作为实际的参数传递给Thread 类的构造函数
(为什么要Runnable 接口的自欸对象传递给Thread的子类对象,所以要让线程去指定对象的run方法,就必须明确该run方法所属的对象)
2.2.5、调用Thread 类的start方法开启线程并且调用Runnable 接口的子类的run 方法。
public static class SwingAndThread extends JFrame implement Runnable{
public void run(){
// 功能代码
}
}
public class test {
public static void main(String[] args) {
Thread a = new Thread(new SwingAndThread());//创建一个新的线程
a.start();
}
}
二、线程的生命周期
生命周期包含7中状态: 出生状态:线程被创建时处于的状态。 就绪状态:调用start()方法之后就进入就绪状态。 运行状态:当线程得到系统资源后就进入运行状态。 等待状态:当线程调用Thread类中的wait()方法时,就进入等待状态。 休眠状态:当线程调用Thread类中的sleep()方法时 阻塞状态:当线程运行时发出输入、输出请求。进入阻塞状态。当等待输入输出结束时线程进入就绪状态。 死亡状态:当线程的run()方法执行完毕时,进入死亡状态。
三、线程的休眠
调用sleep()方法。通常在run()方法内的循环中被使用。
四、线程的加入:
使用场景:要求一个线程先执行完毕之后再执行另一个线程。
使用方法:join();