通过实现Runnable接口创建并启动线程的步骤: (1)定义Runnable接口的实现类,并重写该类的run()方法,该run()方法的方法体就是线程执行体。 (2)创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。 (可以在创建Thread对象时为该Thread对象指定一个名字) (3)调用线程对象的start()方法来启动该线程。 备注:从Java8开始,Runnable接口使用了@FunctionalInterface修饰,即表明Runnable接口是函数式接口,可使用Lambda表达式创建Runnable对象。
小例子如下:
class ThreadDemo02 implements Runnable {
private int i;
@Override
public void run ( ) {
for ( ; i < 5 ; i++ ) {
try {
Thread. sleep ( 200 ) ;
System. out. println ( "子线程" + Thread. currentThread ( ) . getName ( ) + "..." + i) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
}
public class ImplementsRunnable {
public static void main ( String[ ] args) {
System. out. println ( "main...主线程开始" ) ;
ThreadDemo02 threadDemo02 = new ThreadDemo02 ( ) ;
new Thread ( threadDemo02, "新线程1" ) . start ( ) ;
new Thread ( threadDemo02, "新线程2" ) . start ( ) ;
for ( int i = 0 ; i < 3 ; i++ ) {
System. out. println ( "main...i:" + i) ;
}
System. out. println ( "main...主线程结束" ) ;
}
}
控制台打印信息如下: 从打印信息可以看出,两个子线程的i变量是连续的,也就是采用Runnable接口的方式创建的多个线程可以共享线程类的实例变量。这是因为在这种方式下,程序所创建的Runnable对象只是线程的target,而多个线程可以共享同一个target,所以多个线程可以共享同一个线程类的实例变量。
new Thread ( new Runnable ( ) {
@Override
public void run ( ) {
for ( int i = 0 ; i < 5 ; i++ ) {
System. out. println ( "子线程" + Thread. currentThread ( ) . getName ( ) + "..." + i) ;
}
}
} ) . start ( ) ;
只是实现Runnable接口,还可以继承其他类。
适合多个相同线程来处理同一份资源的情况。