1.2.4执行start()的顺序不代表执行run()的顺序
注意,执行start()方法的顺序不代表线程启动的顺序。创建测试用的项目如下:
package extthread;
public class MyThread extends Thread {
private int i;
public MyThread(int i) {
super();
this.i = i;
}
@Override
public void run() {
System.out.println(i);
}
}
运行类Test.java代码如下:
package test;
import extthread.MyThread;;
public class Test {
public static void main(String[] args) {
final MyThread t11 = new MyThread(1);
final MyThread t12 = new MyThread(2);
final MyThread t13 = new MyThread(3);
final MyThread t14 = new MyThread(4);
final MyThread t15 = new MyThread(5);
final MyThread t16 = new MyThread(6);
final MyThread t17 = new MyThread(7);
final MyThread t18 = new MyThread(8);
final MyThread t19 = new MyThread(9);
final MyThread t110 = new MyThread(10);
final MyThread t111 = new MyThread(11);
final MyThread t112 = new MyThread(12);
final MyThread t113 = new MyThread(13);
t11.start();
t12.start();
t13.start();
t14.start();
t15.start();
t16.start();
t17.start();
t18.start();
t19.start();
t110.start();
t111.start();
t112.start();
t113.start();
}
}
程序运行的结果如下图所示:
使用代码
MyThread thread = new MyThread();
thread.start();
启动一个线程后,JVM直接调用MyThread.java 类中的run()方法。
1.2.5实现Runnable接口
如果想创建的线程类已经有了一个父类了,就不能再及程序继承自Thread类,因为java不支持多继承,所以需要实现Runnable接口来结局这样的情况。创建代码来实现:
package myrunnable;
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("运行中");
}
}
如何使用这个MyRunnable.java类呢?这个就要看一下Thread.java的构造函数了,如下图所示
在Thread.java类的8个构造函数中,有5个可以传入Runnable接口,为了说明构造函数支持传入一个Runnable接口的对象,运行如下类代码:
package myrunnable;
public class Run {
public static void main(String[] args) {
Runnable runnable = (Runnable) new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
System.out.println("运行结束!");
}
}
运行结果如下图所示: