1:继承java.lang.Thread类
Thread是java.lang包中的一个子类,从这个类中实例化的对象代表线程,通过继承创建并执行一个线程
通过继承Thread类创建并执行一个线程步骤如下:
- 创建一个能继承Thread类的子类
- 覆写Thread中的run()方法
- 创建一个线程对象
- 通过线程类对象调用start方法启动线程,启动线程之后会自动调用覆写的run方法执行线程
**在main方法中使线程执行需要调用Thread中的start方法,如果不调用start方法的话线程是不会启动的。
创建Thread实例,常用的两种构造方法
1:
public Thread();//创建一个新的线程对象
2:
public Thread(String threadname);//创建一个名为threadname的线程对象
继承Thread类创建一个新的线程的语法如下:
public class Thread子类的类名 extends Thread{
}
下面介绍一个实例:
package THREAD;
class ThreadTest extends Thread {
private int count = 10;
//重写run方法
public void run() {
while (true) {
System.out.print(count + " ");
if (--count == 0) {
break;
}
}
}
public static class first {
public static void main(String[] args) {
Thread test = new ThreadTest();//创建一个线程对象
test.start();//这段代码会瞬间执行,告诉jvm再分配一个新的栈给线程t
/*
有了多线程以后main方法结束,即使主方法线程没有方法栈帧了
可能会有其他线程和其他栈中的栈帧
main方法结束程序可能还在执行
*/
}
}
}
输出结果是:
10 9 8 7 6 5 4 3 2 1
Process finished with exit code 0
**理解:**其实完成线程的真正功能代码是放在类的run()方法中,当一个类继承Thread类时,就可以在该类中重写run()方法,将实现该功能的代码放在run()方法中,然后同时调用Thread类中的start()方法执行线程,也就是所谓的调用run()方法 ,但是start()调用一个以及启动的线程的话
,系统就会抛出ILLegalThreadStateException异常。
当执行一个程序时,会自动执行一个线程,main()就是在这个线程上运行的,这个线程是由java虚拟机负责的,程序员调用自己的线程就是调用start()方法。
2:实现Runnable接口
上一个方法只能继承Thread,java语言不支持多继承,但是要当前类实现多线程,那么可以使用Runnable接口来实现。
实现Runnable接口的语法如下:
public class Thread extends Object implements Runnable{
}
**事实上我们可以查询API,实质上是Thread类实现了Runnable接口,其中的run()方法就是对runnable接口中的run()方法的具体实现。
Runnable接口中只有一个run()方法,它非Thread类子类的类提供的一种激活方式。一个类实现Runnable接口后,并不代表该类是一个“线程”类,不能直接运行,必须通过Thread实例才能创建并运行线程。
通过Runnable接口创建线程的步骤如下:
1、定义实现Runnable接口的类,并实现该类中的run()方法。
2、建立一个Thread对象,并将实现的Runnable接口的类的对象作为参数传入Thread类的构造方法。
3、通过Thread类中的start()方法启动线程,并运行。
流程图如下:
创建一个类去实现runnable类——>然后创建这个类的对象——>创建一个Thread类的对象——>将上面实现runnable的类的对象作为参数传给Thread的构造方法——>然后通过Thread的对象调用start()方法
注:直接调用Thread类或Runnable类对象的run()方法是无法启动线程的,这只是一个简单的方法调用必须通过Thread方法中的start()才行。
*/
下面写一段代码来实现一下:
class RenWu implements Runnable{
//重写run()方法
public void run()
{
//获取当前线程的名字
System.out.println("当前线程:"+Thread.currentThread().getName());
//Thread.currentThread()获取当前对象
for(int i=0;i<30;i++)
{
System.out.print("A");
}
}
}
public class Run{
public static void main(String[] args) {
//创建一个任务对象
RenWu rw = new RenWu();
//将实现的Runnable类的实例传入构造函数
Thread thread = new Thread(rw);
thread.start();
thread.setName("t1");//给当前线程改名
//获取主线程的名字
System.out.println("主线程:[" + Thread.currentThread().getName() + "]");
/* for(int i=0;i<30;i++)
{
System.out.println("C");
}
*/
}
}
输出结果为:
主线程:[main]
当前线程:t1
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Process finished with exit code 0