• 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);
        }
    }

    第一次运行结果:

    第二次运行结果:

     

  • 相关阅读:
    Linux基础知识[1]【ACL权限】
    docker 入门学习篇【基本命令与操作】
    centos7.1下 Docker环境搭建
    RHEL6.5下更新python至2.7版本
    Github初学者探索
    vmware下linux虚拟机传文件解决方案之 xftp
    mysql 常用操作命令
    常用DNS记录
    常见网络协议端口号整理
    DNS原理及其解析过程 精彩剖析
  • 原文地址:https://www.cnblogs.com/oscar1987121/p/10219595.html
Copyright © 2020-2023  润新知