Java面试知识点(三十一)多线程启动方式

一、继承Thread类

继承thread类,并重写run方法,实例化该类对象,调用start方法

代码示例

public class thread1 extends Thread {
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println(i+"  run1()");
        }
    }

    public static void main(String args[]){
        thread1 t1 = new thread1();
        t1.start();
        for (int i = 1; i <= 10; i++) {
            System.out.println(i+"  main1()");
        }
    }
}

运行结果(结果不唯一)

1  main1()
1  run1()
2  run1()
3  run1()
4  run1()
5  run1()
6  run1()
7  run1()
8  run1()
9  run1()
10  run1()
2  main1()
3  main1()
4  main1()
5  main1()
6  main1()
7  main1()
8  main1()
9  main1()
10  main1()

二、实现Runnable 接口

实现runnable接口,并重写run方法,实例化该类对象,并实例化一个thread类的对象并把实现runnable接口的对象作为参数传入thread对象中,调用thread类对象的start方法。

代码示例

public class thread2 implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println(i+"  run()");
        }
    }

    public static void main(String args[]){
        thread2 t2 = new thread2();
        Thread t = new Thread(t2);
        t.start();
        for (int i = 1; i <= 10; i++) {
            System.out.println(i+"  main()");
        }
    }
}

运行结果(结果不唯一)

1  main()
1  run()
2  main()
2  run()
3  run()
4  run()
5  run()
6  run()
7  run()
8  run()
9  run()
10  run()
3  main()
4  main()
5  main()
6  main()
7  main()
8  main()
9  main()
10  main()

这两种创建线程的方法,无疑第二种 (实现 Runnable 接口) 要好一些,因为第一种创建方法继承了 Thread 后就无法继承其他父类。


补充:为什么线程重写是在run中,而启动多线程的方式确实start?

1.start()方法来启动线程,真正实现了多线程运行。这时无需等待 run 方法体代码执行完毕,可以直接继续执行下面的代码;通过调用 Thread 类的 start () 方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此 Thread 类调用方法 run () 来完成其运行操作的, 这里方法 run () 称为线程体,它包含了要执行的这个线程的内容, Run 方法运行结束, 此线程终止。然后 CPU 再调度其它线程。

2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待 run 方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程 —— 这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

你可能感兴趣的:(java,面试,Java面试知识汇总)