java多线程-基础

1. 基本用法

总共两种,

第一种:继承Runnbale接口,实现run方法

Runnable r = new Runnable() {
    @Override
    public void run() {

    System.out.println("123");

    }
};

Thread thread = new Thread(r);
thread.start();    

第二种:继承Thread类,重写run方法

class MyThread extends Thread{

    @Override
    public void run() {
        for(int i = 0;i<10;i++){
            System.out.println(Thread.currentThread().getName());
        }
    }
}

调用的时候

MyThread myThread = new MyThread();
myThread.start();

总结:两种的区别是,没区别,两种都需要new一个Thread的实例,第一种就是传入Runnable实例,当Thread类的run被调用的时候,调用Runnable的run方法。第二种是重写Thread的run方法,意思就是说,不执行父类Thread里面的run方法了,直接执行你重写的run里面的内容,所以结果也是一样。如果当前类已继承了一个父类,不能继承Thread,那么就可以考虑继承Runnable接口。个人认为继承Runnable接口更家灵活。

2. 线程随机性

这里就写了一段代码,测试效果,可以看出来,每次执行的结果都是不一样的,证明,线程具有随机与不确定性,Thread的start方法就是告诉CPU,线程准备就绪,等待CPU的调用run方法,所以当CPU空闲的时候,他就会去调用run的方法。所以为什么上面的代码里面调用的是start而不是run,因为调用start最终的结果是由另外一个线程调起run方法,而如果一开始调用run,那就不是在同一个线程当中执行。切记这一点

public class TestThread {
    public static void main(String[] args) {

        MyThread myThread = new MyThread();
        myThread.start();

        for(int i = 0;i<10;i++){
            System.out.println(Thread.currentThread().getName());
        }
    }


}
class MyThread extends Thread{

    @Override
    public void run() {
        for(int i = 0;i<10;i++){
            System.out.println(Thread.currentThread().getName());
        }
    }
}

第一次执行结果:

第二次执行结果:

3. 调用start顺序不代表线程启动顺序

这里写了一段代码测试,循环新建线程并调用start,按顺序应该从0到9,但结果并没有,每一次运行的结果都不一样,而且是无序,代表start的顺序并不代表run被调用的顺序

public class TestThread {
    public static void main(String[] args) {

        for(int i = 0;i<10;i++){
            MyThread myThread = new MyThread(i);
            myThread.start();

        }
    }


}
class MyThread extends Thread{

    private int ti;
    public MyThread(int ti){
        this.ti = ti;
    }

    @Override
    public void run() {
        System.out.println("Thread_" + ti);
    }
}

第一次运行结果:

第二次运行结果:

 

原文地址:https://www.cnblogs.com/oscar1987121/p/10219595.html