![](https://csdnimg.cn/release/download_crawler_static/5828139/bg6.jpg)
才启动起来的,因此也就是说,这两个线程是从主线程中启动的。
那能不能直接调用 run()方法呢?从语法上来说,完全可以对线程对象调用 run()方法。
但是,那样的话,并没有创建新线程。例如,如果在主方法中这样来调用:
t1.run();
t2.run();
这样就意味着调用了这两个对象的 run 方法,执行的时候,会先执行 t1 对象的 run 方
法,当 t1 的 run 方法返回之后,再执行 t2 线程的 run 方法。也就是说,在主线程中运行了
这两个 run 方法,程序自始至终只有一个线程在执行。
2.2 Runnable 接口
除了继承 Thread 类之外,我们还可以采用另外一种方式创建线程,就是实现 Runnable
接口。Runnable 接口在 java.lang 包中定义,在这个接口中,只包含一个方法:run()方法。
该方法签名如下:
void run()
由于这个方法定义在接口中,因此默认就是 public 的。在实现 Runnable 接口的时候,
只需要实现这个 run 方法就可以了。
下面我们修改刚刚的 MyThread2 这个类,把这个类改名为 MyRunnable2,并且由继承
Thread 类改为实现 Runnable 接口。相应代码如下:
class MyRunnable2 implements Runnable{
public void run(){
for(int i = 1; i<=1000; i++){
System.out.println(i + " ###");
}
}
}
在上面的代码中,对 run()方法的实现没有任何修改,而只是改动了第一行:把继承
Thread 类改成了实现 Runnable 接口。
修改完了线程的实现之后,还必须要修改一下创建线程的代码。由于 MyRunnable2 类
不是 Thread 类的子类,因此创建的 MyRunnable2 类型的对象不能直接赋值给 Thread 类型的
引用。换句话说,我们利用 MyRunnable2 创建出来的不是一个线程对象,而是一个所谓的
“目标”对象。代码如下:
Runnable target = new MyRunnable2();
创建了目标对象之后,可以利用目标对象再来创建线程对象,代码如下:
Thread t2 = new Thread(target);
通过上面的两行代码,我们就可以利用 Runnable 接口的实现类来创建线程对象。创建
完线程对象之后,需要启动线程时,同样要调用线程对象的 start()方法。完整的代码如下:
class MyThread1 extends Thread{
public void run(){
for(int i = 1; i<=1000; i++){
System.out.println(i + " $$$");
}
}