线程创建------实现Runnable接口
步骤 |
通过实现Runnable接口创建并启动线程的步骤:
(1)定义Runnable接口的实现类,并重写该类的run()方法,该run()方法的方法体就是线程执行体。
(2)创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
(可以在创建Thread对象时为该Thread对象指定一个名字)
(3)调用线程对象的start()方法来启动该线程。
备注:从Java8开始,Runnable接口使用了@FunctionalInterface修饰,即表明Runnable接口是函数式接口,可使用Lambda表达式创建Runnable对象。
代码实例 |
小例子如下:
//实现Runnable接口,重写run方法
class ThreadDemo02 implements Runnable{
private int i;
@Override
public void run(){
for (; i < 5; i++) {
try {
Thread.sleep(200);
//currentThread()方法是Thread类的静态方法,该方法返回当前正在执行的线程对象。
//getName()方法是Thread类的实例方法,返回调用该方法的线程的名字。
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...主线程开始");
//1、创建线程的target
ThreadDemo02 threadDemo02 = new ThreadDemo02();
//2、启动线程
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,所以多个线程可以共享同一个线程类的实例变量。
使用匿名内部类创建Runnable对象 |
//创建并启动线程:
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("子线程" + Thread.currentThread().getName() + "..." +i);
}
}
}).start();
优势 |
只是实现Runnable接口,还可以继承其他类。
适合多个相同线程来处理同一份资源的情况。
还没有评论,来说两句吧...