zoukankan      html  css  js  c++  java
  • (一)认识多线程

    一、进程

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

  • 相关阅读:
    判断大小写数字个数,取交集和并集
    软件工程总结
    正则表达式(邮箱)
    今天距离你生日的天数
    字符数量,查回文
    解决一个表单中的两个或者多个按钮提交到不同的页面中问题
    jsp前台输入框不输入值,后台怎么取出整型?
    第十次作业
    CMD命令行
    Kali渗透安卓手机
  • 原文地址:https://www.cnblogs.com/shyroke/p/6771444.html
Copyright © 2011-2022 走看看