• 多线程第一天


    多线程

    1.要想了解多线程,必须先了解线程;要了解线程就要先了解进程,因为线程是依赖于进程而存在的;说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
    
    2.什么是进程?
        a.进程是执行程序的一次执行过程.它是一个动态的概念,是系统资源分配的单位.
        b.只有运行的程序才有进程.
        c.一个进程可以有多个线程
    
    3.多进程有什么意义?
        a.单进程只能做一件事情
        b.多进程同一时间段能做多件事情,可以执行多个任务
    
    4.什么是线程?
        a.多进程内可以执行多个任务,而每一个任务就是一个线程
        b.线程是一个程序的执行单元.执行路径,是一个程序使用cpu最基本的单位,是一个独立的执行路径
        c.单线程:程序只有一条执行路径
        d.多线程:程序有多条执行路径
    
    5.多线程的意义?
        a.多线程的存在是为了提高应用程序的使用率
        b.程序的执行其实都是在抢CPU的资源,CPU的执行权。
    	c.多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权。
            
    注意:
        很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错局。
    

    线程创建方式

    Thread class 继承Thread类
    
    Runnable接口  实现runnable接口
    
    Callable接口	实现callable接口
    

    创建线程方式:继承Thread类和实现Runnable接口

    创建线程方式1:继承Thread类
    	1.自定义线程类继承Thread类
    	2.重写run() 方法,编写线程执行体
    	3.创建线程对象,调用start()方法启动线程
    
    注意:线程开启不一定立即执行,有CPU调度执行
    代码:
    public class ThreadTest extends Thread{
        @Override
        public void run(){
            线程体
            for (int i=0;i<20;i++){
                System.out.println("A--"+i);
            }
        }
    	//main线程   主线程
        public static void main(String[] args) {
            //创建一个线程对象
            ThreadTest threadTest=new ThreadTest();
            //调用start()方法
            threadTest.start();
            //线程体
            for (int i=0;i<20;i++){
                System.out.println("B--"+i);
            }
        }
    }
    
    创建线程方式2:实现Runnable接口
        1.定义MyRunnable类实现Runnable接口
        2.实现run()方法;编写线程执行体
        3.创建线程对象,调用start()方法启动进程
    代码:
    public class ThreadTest3 implements Runnable{
        
        @Override
        public void run() {
            for (int i=0;i<200;i++){
                System.out.println("A--"+i);
            }
        }
        //main线程   主线程
        public static void main(String[] args) {
            //创建Runnable接口的实现类对象
            ThreadTest3 threadTest3=new ThreadTest3();
            //创建线程对象,通过线程对象开启线程
            Thread thread=new Thread(threadTest3);
            thread.start();
            for (int i=0;i<1000;i++){
                System.out.println("B--"+i);
            }
        }
        
    总结:
        继承Thread类:
        	子类继承Thread类具备多线程能力
            启动进程:子类对象.start()
            不建议使用:避免OOP单继承局限性
        实现Runnable接口
            实现接口Runnable接口
            启动进程:传入目标对象+Thread对象.start()
            推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
    

    Thread类中的方法

    String getName():返回该线程的名称。 
    void setName(String name):改变线程名称 
    void setPriority(int newPriority):更改线程的优先级。(1~10)
    int getPriority():返回线程的优先级 (每个线程默认优先级5)
    static Thread currentThread():返回当前正在执行的线程对象
    static void sleep(long millis):睡眠
    void join():等待该线程终止。 
    

    静态代理

    1.真实对象和代理对象都要实现同一接口
    2.代理对象要代理真实角色
        
    好处:
        1.代理对象可以做很多真实对象没法做的事情
        2.真实对象专注做自己的事情
    
  • 相关阅读:
    Spring Boot启动命令参数详解及源码分析
    面试题-关于Java线程池一篇文章就够了
    Spring Boot中@ConditionalOnProperty使用详解
    Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean
    Spring Boot 注解之ObjectProvider源码追踪
    软件从业者不可不读的一本书
    SpringBoot之DispatcherServlet详解及源码解析
    书终于交稿了,聊聊写技术书这件事
    Python IDE:pycharm
    python安装
  • 原文地址:https://www.cnblogs.com/lhy8116/p/14205153.html
Copyright © 2020-2023  润新知