• java多线程(一)


    一、程序、进程、线程的定义

     程序:  一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本。

     进程:  是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命

              周期。  它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在

              一定的数据 集上运行的全部动态过程。通过进程控制块(PCB)唯一的标识某个进程。同时进程占据着相应的资源(例如包

              括cpu的使用 ,轮转时间以及一些其它设备的权限)。是系统进行资源分配和调度的一个独立单位。

     线程:   一个线程是进程的一个顺序执行流。可以理解为进程的多条执行线索,每条线索又对应着各自独立的生命周期。

              线程是进程的一个实体,是CPU调度和分派的 基本单位,它是比进程更小的能独立运行的基本单位。

                                                                                           线程的状态转化图

                                                                                            进程和线程的区别

    二、java中的线程

    1.线程的创建和启动

    1)方式一:继承Thread类

         继承Thread类,重写run()方法,然后直接new这个对象的实例,创建一个线程的实例,

         调用start()方法启动线程。

        继承Thread创建并启动,demo:

    public class TestThread{
    
        public static void main(String[] args) {
            //创建子类对象
            Rabbit rab = new Rabbit();
            //创建子类对象
            Tortoise tor =new Tortoise();
            
            //调用start 方法,不要调用run方法
            rab.start();
            tor.start();
    
        }
    
    }
    
    /**
     * 模拟龟兔赛跑
     1、创建多线程  继承Thread  +重写run(线程体)
     2、使用线程: 创建子类对象 + 对象.start()  线程启动
         
     * 
     * @author Chaosju
     *
     */
    public class Rabbit extends Thread {
    
        @Override
        public void run() {
            //线程体
            for(int i=0;i<100;i++){
                System.out.println("兔子跑了"+i+"步");
            }       
        }
        
    }
    class Tortoise extends Thread {
    
        @Override
        public void run() {
            //线程体
            for(int i=0;i<100;i++){
                System.out.println("乌龟跑了"+i+"步");
            }  
            
        }
        
    }

    注:

    推荐使用方式二:实现Runable接口

    1.避免单继承的局限性

    2.便于共享资源

    3.在这种方式下,可以多个线程共享一个Runnable target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。

    2)方式二:实现Runable接口

      实现Runnable接口,重写run()方法,然后调用new Thread(runnable)的方式创建一个线程,

      调用start()方法启动线程。

     实现Runable创建并启动,demo:

     /*使用 Runnable 创建线程
      1、类实现 Runnable接口 +重写 run()   -->真实角色类
      2、启动多线程  使用静态代理
        1)、创建真实角色
        2)、创建代理角色 +真实角色引用
        3)、调用 .start() 启动线程
      
      */
    public class Programmer implements Runnable {
    
        @Override
        public void run() {
            for(int i=0;i<1000;i++){
                System.out.println("一边敲helloworld....");
            }
        }
    
    }
    
    public class ProgrammerApp {
    
        public static void main(String[] args) {
             //创建线程类(真实角色)
            Programmer pro =new Programmer();        
              //创建代理角色 +真实角色引用
            Thread proxy =new Thread(pro);
              //调用 .start() 启动线程
            proxy.start();
            
            for(int i=0;i<1000;i++){
                System.out.println("一边聊qq....");
            }
        }
    
    }
    采菊东篱下,悠闲现南山~
  • 相关阅读:
    React之react-router(connected-react-router/react-router-dom)
    React之redux学习日志(redux/react-redux/redux-saga)
    React之常用技术栈
    js书写规范
    Mybatis plus 常用更新操作
    Mybatis plus 常用删除方式
    Mybatis plus 实体类常用注解
    spring boot 单元测试
    mybatis plus 添加启用打印日志
    Lombok插件优缺点
  • 原文地址:https://www.cnblogs.com/ChaosJu/p/4528895.html
Copyright © 2020-2023  润新知