实现多线程的两种方式

继承Thread类创建多线程

重写Thread类中的run()方法,在run()方法中实现运行在线程上的代码。

下面我们通过一个实例演示,代码如下:
定义一个MyThread类继承Thread类

public class MyThread extends Thread{
    @Override
    public void run() {
        //重写run方法,即线程的执行代码
        for (int i = 0; i < 10; i++) {
            System.out.println("锄禾日当午"+i);
        }
    }
}

程序入口代码如下:

    public static void main(String[] args) {
        //创建自定义Thread对象
        MyThread m = new MyThread();
        //启动新线程
        m.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("xxxx"+i);
        }
    }

运行结果如下:

xxxx0
锄禾日当午0
xxxx1
锄禾日当午1
xxxx2
锄禾日当午2
xxxx3
锄禾日当午3
锄禾日当午4
锄禾日当午5
锄禾日当午6
锄禾日当午7
锄禾日当午8
锄禾日当午9
xxxx4
xxxx5
xxxx6
xxxx7
xxxx8
xxxx9

我们可以看到,在执行主程序的for循环中,也执行了MyThread类中重写的run()方法,说明创建的线程成功运行。


实现Runnable接口创建多线程

实现接口中的run()方法,用于执行线程。将Runnable对象传入Thread构造方法中,调用start()方法启动线程。

下面用一段代码演示:

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("窗前明月光"+i);
        }
    }
}

程序入口代码如下:

public class RunnableTest {
    public static void main(String[] args) {
        //创建Runnable()实例
        MyRunnable r = new MyRunnable();

        //创建线程对象
        Thread t = new Thread(r);
        t.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("Moonlight"+i);
        }
    }
}

实现Runnable 与 继承Thread 对比有如下优势:

  1. 适合多个相同程序代码的线程取处理同一个资源的情况,把线程与程序代码、数据有效的分离,很好体现面向对象的设计思想。
  2. 可以避免由于Java单继承带来的局限性。开发中常碰到这种情况,就是使用一个已经继承某一个类的子类创建线程,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,只能实现Runnable接口的方式。
  3. 后续学习的线程池技术,接收Runnable类型的"任务",不接受Thread类型的线程。

通过匿名内部类创建Thread对象

通过匿名内部类,我们可以更简便的创建并启动线程。

    public static void main(String[] args) {
//        MyThread m = new MyThread();
//        m.start();
        new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("锄禾日当午" + i);
                }
            }
        }.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("xxxx" + i);
        }
    }

运行结果如下:

锄禾日当午0
xxxx0
锄禾日当午1
xxxx1
锄禾日当午2
xxxx2
锄禾日当午3
xxxx3
锄禾日当午4
xxxx4
锄禾日当午5
xxxx5
锄禾日当午6
xxxx6
锄禾日当午7
xxxx7
锄禾日当午8
xxxx8
锄禾日当午9
xxxx9
posted on 2021-10-24 19:55  技术小伙伴  阅读(185)  评论(0编辑  收藏  举报