创建线程的两种方式比较:Thread和Runnable

   首先 Thread是类,Runnable是接口。

   一是写一个类继承自Thread,然后重写里面的run方法,start方法启动线程

   二是写一个类实现Runnable接口,实现里面的run方法,new Thread(Runnable target).start()方法来启动

   两个都可以实现多线程编程,但是基于java是单继承,所以实现Runable更灵活。并且Runable可以简单的实现变量的线程间共享。

  创建线程包括继承Thread类和实现Runnable接口两种方式(JDK5.0以后还包括了实现Callable等方式来实现线程,这里不做介绍,感兴趣的可以自己查资料),下面介绍第一种创建线程的方式(通过继承Thread类):

package com.test.thread;

public class EasyThread extends Thread {
    private String name;
    public EasyThread(String name) {
        this.name=name;
    }
    //重写父类Thread中的run方法
    @Override
    public void run() {
        for (int i = 0; i <2; i++) {
            System.out.println(name+"运行"+i);
            try {
                //随机设置休眠时间
                sleep((int)Math.random()*10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    public static void main(String[] args) {
        //创建一个线程
        EasyThread thread1=new EasyThread("线程1");
        //启动线程(启动线程后会执行上面的run方法)
        thread1.start();
        EasyThread thread2=new EasyThread("线程2");
        thread2.start();
    }

}

        多次运行上述代码,查看运行结果,发现可能每次的输出结果可能与上次相同也可能不同。原因是休眠时间不同,导致运行的结果不尽相同,可以好好体会一下。下面讲述第二种创建线程的方式(实现Runnable接口):

 

package com.test.thread;

public class ImpRunnable implements Runnable {
    private String name;

    public ImpRunnable(String name) {
        this.name = name;
    }

    // 实现接口Runnable中的run方法
    @Override
    public void run() {
        for (int i = 0; i < 2; i++) {
            System.out.println(name + "运行" + i);
            try {
                // 随机设置休眠时间
                Thread.sleep((int) Math.random() * 10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    public static void main(String[] args) {
        // 创建线程并启动(与第一种方法略有不同)
        new Thread(new ImpRunnable("线程1")).start();
        new Thread(new ImpRunnable("线程2")).start();
    }
}
    以上即为实现线程的两种常用的方式,在使用多线程(多个人共同完成同一个任务)的时候我们一般用实现Runnable接口的方式,原因上面也说了,一是Rannale是一个接口实现起来更加灵活,另一个是Runnable可以实现简单的线程共享。

猜你喜欢

转载自blog.csdn.net/qq_37465368/article/details/80868973