1、继承Thread类,重写run方法
演示:编写一个动物类,构造器传参为动物的名字,run方法中输出该动物的名字100遍
(1)编写Animal类继承Thread类,并重写run方法(将我们的业务功能写在run方法中)
class Animal extends Thread{ private String name; public Animal(String name){ this.name=name; } @Override public void run() { for (int i=0;i<100;i++){ System.out.println("我是:"+name); } } }
(2)在主方法中创建动物对象,并启动该线程(调用start方法)
public class ThreadTest { public static void main(String[] args) { Animal r = new Animal("兔子"); Animal l = new Animal("狼"); r.start(); l.start(); } }
1、start0() 是本地方法,是 JVM 调用, 底层是 c/c++实现。
2、xxx.start()//启动线程-> 最终会执行 animal 的 run 方法。
3、当 main 线程启动子线程时, 主线程不会阻塞, 会继续执行 (此时 主线程和子线程是交替执行的)。
4、Thread 类 实现了 Runnable 接口的 run 方法。
2、实现Runnable接口,重写run方法
什么时候用这种方法?
众所周知java是单继承的,当该类继承了其它父类时就没办法再通过继承Thread类的方法去创建线程了,只能通过实现Runnable的方式创建线程。
我们的演示案例还是如上面所示
演示:编写一个动物类,构造器传参为动物的名字,run方法中输出该动物的名字100遍
(1)编写Animal类实现Runnable接口,并重写run方法(将我们的业务功能写在run方法中)
private String name; public Animal(String name){ this.name=name; } @Override public void run() { for (int i=0;i<100;i++){ System.out.println("我是:"+name); } }
(2)创建Thread的对象,将Animal对象传入并调用Thread对象的start方法
public class ThreadTest { public static void main(String[] args) { Animal r=new Animal("兔子"); Animal l = new Animal("狼"); Thread thread_r = new Thread(r); Thread thread_l = new Thread(l); thread_r.start(); thread_l.start(); } }