方式1、继承Thread类
步骤1:定义一个A类然后继承java.lang.Thread类;
步骤2:在A类中覆盖Thread的run方法;
步骤3:在run方法中编写需要执行的代码,也就是需要执行的方法体;
步骤4:在main方法中,创建线程对象,并启动新的线程;
//创建一个类1继承Java.lang.Thread,并覆盖其run方法
class NewThreadA extends Thread {
public void run(){
for (int i=0;i<=5;i++) {
System.out.println("newThreadA"+i)
}
}
}
//创建一个类2继承Java.lang.Thread,并覆盖其run方法
class NewThreadB extends Thread {
public void run(){
for (int i=0;i<=5;i++) {
System.out.println("newThreadB"+i)
}
}
}
//在main方法中开启线程
public class ExtendsThreadDemo {
public static void main(String[] args) {
NewThreadA newThreadA = new NewThreadA();
NewThreadB newThreadB = new NewThreadB();
newThreadA.start();
newThreadB.start();
//newThreadA.run();
//newThreadB.run();
}
}
//注意开启新线程时要调用start()方法;如果调用run()方法不会开启新线程,只会执行一个线程
执行结果:
1、 调用start()方法结果:
2、 调用run()方法结果:
方式2、实现Runnable接口
步骤1:定义一个类A,实现java.lang.Runnable接口(注意类A不是线程类)
步骤2:实现run方法,编写需要执行的代码;即方法体;
步骤3:在main方法(线程)中,创建线程对象,并启动线程.
//1):定义一个类A继承于java.lang.Thread类.
//创建一个类1继承Java.lang.Thread,并覆盖其run方法
class NewThreadA implements Runnable {
public void run(){
for (int i=0;i<=5;i++) {
System.out.println("newThreadA"+i);
}
}
}
//创建一个类2继承Java.lang.Thread,并覆盖其run方法
class NewThreadB implements Runnable {
public void run(){
for (int i=0;i<=5;i++) {
System.out.println("newThreadB"+i);
}
}
}
public class ExtendsThreadDemo {
public static void main(String[] args) {
//新建两个对象
NewThreadA newThread1 = new NewThreadA();
NewThreadB newThread2 = new NewThreadB();
//新建两个线程
Thread thread1 = new Thread(newThread1);
Thread thread2 = new Thread(newThread2);
thread1.start();
thread2.start();
//thread1.run();
//thread2.run();
}
}
//注意开启新线程时要调用start()方法;如果调用run()方法不会开启新线程,只会执行一个线程
执行结果:
1、 调用start()方法结果:
2、 调用run()方法结果:
分析继承方式和实现方式的区别:
继承方式:
1):从设计上分析,Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了.
2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)
3):从多线程共享同一个资源上分析,继承方式不能做到.
实现方式:
1):从设计上分析,Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口,设计更为合理.
2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用
3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源).