39.线程的实现方式二

线程实现方式二:

    1.自定义一个类实现runnable接口

        class Thread implements Runnable 

        查看源代码,我们可以知道Thread实现了runnable接口

        runnable中只有一个run抽象类

    2.实现run方法,把自定义线程的任务定义在run方法里面

    3.创建一个runnable实现类对象

    4.创建Thread方法,并把runnable实现类对象作为实参传过去

        Thread的构造方法:

            Thread(Runnable target)        分配新的 Thread 对象。

            Thread(Runnable target ,String name) 分配新的 Thread 对象并这个可以给线程一个名字

    5.并用Thread方法的start方法开启一个线程线程

        start方法不是静态的,要实例化对象

    疑问1:runnable的实现类是线程类吗?

        不是,只有Thread和Thread的子类才是线程对象

        rannable的实现类只是是实现了rannable接口的对象而已

    疑问2:为什么我们调用Thread的start方法可以执行runnable接口的实现类的run方法呢?

        源代码如下:

Thread类的构造方法
    public Thread(Runnable target, String name) {
        init(null, target, name, 0);
    }
    Thread类的run方法
    public void run() {
        if (target != null) {
            target.run();
        }
    }
    Thread类的target成员变量
    private Runnable target;

      原来,然后当我们调用Thread的start方法的时候,就调用了Thread的run方法,

      而我们传递一个runnable实现类的对象,然后Thread的run方法会调用runnable实现类的run方法

下面是实现runnable接口的实例代码: 

public class Demo7 implements Runnable {
    
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
        
    }
    public static void main(String[] args) {
        Demo7 demo = new Demo7();
        Thread thread = new Thread(demo,"狗娃");
        thread.run();
        thread.start();
        for (int i = 0; i < 50; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
    
    
}

最后总结一下:

   因为java是单继承多实现,所以我们最好用第二个方式创建线程对象,

  如果出现多语句操作同一个共享资源的话,我们最好用构造代码块,

  最后我们在用多线程的时候,我们应该多避免死锁的现象

原文地址:https://www.cnblogs.com/zjdbk/p/8969124.html