• (一)认识多线程


    一、进程

    • 要想了解线程,首先得提到“进程”这个概念,
    • 进程:进程是操作系统结构的基础;是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的行动;是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单元。
    • 更具体的讲:如下图
    • 每一个exe程序都是一个进程。

    二、线程

    • 线程可以理解成是在进程中独立运行的子任务,比如QQ.exe 运行时就有很多的子任务在同时运行,比如说好友视频线程、传输数据线程、发送表情线程等线程,这些不同的

    子任务或者说线程都可以同时运行,这样一来就可以最大限度地利用CPU的空闲时间来处理其他的任务,比如一边让操作系统处理正在由打印机打印的数据,一边使用Word编辑文档。而CPU在这些任务(线程)之间不停切换,由于切换速度快,给使用者产生了这些线程似乎同时运行的错觉,但实际上并不是。

    三、初步使用多线程

    • 案例一:
    package bean;
    
    public class Test {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
    }
    }

    结果:

    • 控制台输出的“main”其实就是一个名称叫main的线程在执行main()方法中的代码。

     四、继承Thread类

    • 实现多线程编程的方式主要有两种: 

         1. 继承Thread 类

         2. 实现Runnable 接口   

    •  Thread类也实现了 Runnable 接口 。
    • 案例一(线程调用的随机性测试(1)):
    package bean;
    
    public class Test {
        public static void main(String[] args) {
            MyThread myThread = new MyThread();
            myThread.start();
            System.out.println("运行结束");
    
        }
    }
    
    class MyThread extends Thread {
    
        @Override
        public void run() {
            super.run();
            System.out.println("MyThread");
        }
    
    }

    结果:

    • 在使用多线程的时候,代码的运行结果与代码执行顺序或调用顺序是无关的。   线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法,
    • 所以才会有先打印出“运行结束”再打印“myThread”这样的结果。
    •  注意:  如果多次调用start()方法,会出现异常如下:
    Exception in thread "main" MyThread
    java.lang.IllegalThreadStateException
    •  案例二(线程调用的随机性测试(2)):
    package bean;
    
    public class Test {
        public static void main(String[] args) {
            MyThread myThread = new MyThread();
            myThread.start();
    
            try {
                for (int i = 0; i < 10; i++) {
                    int time = (int) Math.random() * 1000;
                    Thread.sleep(time);
                    System.out.println("main==" + Thread.currentThread().getName());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    }
    
    class MyThread extends Thread {
    
        @Override
        public void run() {
    
            try {
                for (int i = 0; i < 10; i++) {
    
                    int time = (int) Math.random() * 1000;
                    Thread.sleep(time);
                    System.out.println("run==" + Thread.currentThread().getName());
    
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    结果:

    • start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法,这个过程就是让系统安排时间来调用run()方法,具有异步的效果,

    如果在 myThread.start(); 不是调用start()方式而是执行调用myThread.run()方法,那么此线程对象并不交给“线程规划器”来进行处理,而是由main主线程来调用run()

    方法,也就是必须等run()方法执行完毕之后才会执行run()方法以后的代码。

    P7

  • 相关阅读:
    linux下netstat命令详解
    linux下strace命令详解
    /proc/uptime
    趣味理解网关、路由等概念
    OPENCV运行的问题,自带的程序可以运行,但是自己制作的QT报错
    第九章 MIZ702 ZYNQ片上ADC的使用
    第四章 MIZ701 ZYNQ制作UBOOT固化程序
    第三章 VIVADO 自定义IP 流水灯实验
    第一章 MIZ701 VIVADO 搭建SOC最小系统HelloWorld
    Zynq-7000 MiZ701 SOC硬件使用手册
  • 原文地址:https://www.cnblogs.com/shyroke/p/6771444.html
Copyright © 2020-2023  润新知