继承Thread类,实现多线程
- java里面提供了一个java.lang.Thread的程序类,那么一个类只要继承了此类就表示这个类为线程的主体类,但是并不是说这个类就可以实现多线程处理了,因为还需要覆写Thread类中提供的一个run()方法(public void run()),而这个方法就属于线程的主方法。
class MyThread extends Thread {//线程主体类
private String title;
public MyThread(String title) {
this.title = title;
}
@Override
public void run() {//线程的主体方法
for(int x = 0; x < 10 ; x++) {
System.out.println(this.title + "运行,x = " + x);
}
}
}
- 多线程要执行的功能,都应该在run()方法中进行定义,但是需要说明的是:
在正常情况下,如果要想使用一个类中的方法,那么肯定要产生实例化对象,而后去调用类中提供的方法,但是run()方法不能直接调用的,因为这牵扯到一个操作系统的资源调度问题,所以要想启动多线程必须使用start()方法。
public class ThreadDemo {
public static void main(String[] args) {
new MyThread("线程A").start();
new MyThread("线程B").start();
new MyThread("线程C").start();
}
}
- 通过此时的调用你可以发现,虽然调用了start()方法,但是最终执行的run()方法,并且所有的线程对象都是交替执行的。执行顺序不可控。
基于Runnable接口实现多线程
- 虽然可以通过Thread类的继承来实现多线程的定义,但是在Java程序里面对于继承永远都是存在有单继承局限的,所以在Java里面又提供有第二种多线程的主体定义结构形式:实现java.lang.Runnable接口,此接口定义如下:
@FunctionalInterface // 从JDK1.8引入了Lambda 表达式之后就变为了函数式接口
public interface Runnable {
public void run();
}
class MyThread implements Runnable {//线程主体类
private String title;
public MyThread(String title) {
this.title = title;
}
@Override
public void run() {//线程的主体方法
for(int x = 0; x < 10 ; x++) {
System.out.println(this.title + "运行,x = " + x);
}
}
}
- 但是此时由于不在继承Thread父类了,那么对于此时的MyThread类中也就不在支持有start()这个继承方法,可是不使用Thread.start()方法是无法进行多线程启动的,那么这个时候就需要去观察一下Thread类所提供的构造方法了。
public class ThreadDemo {
public static void main(String[] args) {
Thread threadA = new Thread(new MyThread("线程A"));
Thread threadB = new Thread(new MyThread("线程B"));
Thread threadC = new Thread(new MyThread("线程C"));
threadA.start();
threadB.start();
threadC.start();
}
}