首页 > 其他分享 >多线程的实现

多线程的实现

时间:2025-01-13 19:59:22浏览次数:3  
标签:多线程 Thread 实现 任务 线程 执行 public

1.线程和进程的概述

1.1 什么是进程?

正在执行的程序,称为进程。 进程是系统分配资源的单元。 现在系统支持多进程的。

1.2 什么是线程?

线程,又称轻量级进程(Light Weight Process)。
线程是进程中的一条执行路径,也是CPU的基本调度单位。
若一个程序可同一时间执行多个线程,就是支持多线程的.
一个进程由一个或多个线程组成,彼此间完成不同的工作,
同时执行,称为多线程。

一个进程有多个或一个线程组成。比如: 360就是支持多线程的程序。  

进程与进程之间无法数据共享。

线程与线程之间可以共享数据。

2. 并发和并行的概述

并行:指两个或多个事件在同一时刻发生(同时发生 同时处理 执行者不是一个)。
并发:指两个或多个事件在同一个时间段内发生【交替的发生 执行者是一个】。

电脑(单核)在执行任务时是采用并发还是并行?
使用的是并发,因为电脑上只有一个CPU,但是电脑上却可以同时运行多个程序,这是一种假象,因为CPU的计算速度极快,10^-9每秒就会计算一次,而人能感觉到的时间流失是秒,所以电脑给我们一种感觉好像电脑上程序在同时执行。

3. 为什么使用多线程?

为了提高cpu的使用率。从而提高的程序的效率。

4. java如何实现多线程任务

默认java程序为单线程。只有一个main的主线程。

java实现多线程的方式有三种:

第一种: 继承Thread类

第二种: 实现Runnable接口

第三种: 实现Callable接口

4.1 继承Thread完成多线程

继承Thread
Thread就是一个线程类,里面定义所有和线程相关的功能,只有是这个类才能开启的任务,才能被CPU单独去执行。

Java中线程执行的时候是采用的并发。学习的过程中不要纠结于多个线程执行的结果,因为是随机在执行,抢占式的在使用CPU资源。

1.创建一个类并继承Thread
2.重写线程run方法---线程执行的的任务代码
3.创建线程并开启线程start()

public class MyThread extends Thread{

    //线程开启值要干的任务。
    @Override
    public void run() {
        //循环的目的就是让线程执行一段时间
        for (int i = 0; i < 20; i++) {
            System.out.println("线程=============>"+i);
        }
    }
}

public class Test01 {
    public static void main(String[] args) {
        //1.创建线程对象
        MyThread t1=new MyThread();
        //2.开启线程start-底层-默认调用run方法
        t1.start();

        for (int i = 0; i < 20; i++) {
            System.out.println("主线程------------------->"+i);
        }
    }
}

上面继承Thread类后,还能继承其他类吗?不能。 扩展性相对比较差。

4.2 实现Runnable接口

package org.example.demo02;

public class My implements Runnable{
    //线程启动后执行的任务代码块
    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
            System.out.println("线程任务代码----------------》"+i);
        }
    }
}
 

package org.example.demo02;

public class Test01 {
    public static void main(String[] args) {
        //1.创建任务对象
        My my=new My();
        //2.创建线程对象
        Thread t=new Thread(my); //把任务对象交于线程对象。
        t.start();//调用任务对象中的run方法
        for (int i = 0; i < 20; i++) {
            System.out.println("main线程:"+i);
        }
    }
}
 

上面的方案 都无法获取任务执行后的结果。从jdk1.5后引入Callable完成任务 并可以有返回结果

4.3 实现Callable接口

package org.example.demo03;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {
    //线程开启后执行的任务代码。。
    @Override
    public Integer call() throws Exception {
        int sum=0;
        for (int i = 1; i <= 100; i++) {
            System.out.println("线程:"+i);
            sum+=i;
        }
        return sum;
    }
}

package org.example.demo03;

import org.example.demo02.My;

import java.util.concurrent.FutureTask;

public class Test01 {
    public static void main(String[] args) throws Exception {
        //1.创建MyCallable对象
        MyCallable my=new MyCallable();
        //2. 把上面的Callable对象封装到一个任务对象。FutureTask封装任务对象以及任务执行完的结果也封装到该类中
        FutureTask task=new FutureTask<>(my);
        //2.创建线程对象
        Thread t=new Thread(task);

        t.start();

        for (int i = 0; i < 20; i++) {
            System.out.println("main线程:"+i);
        }

        System.out.println("线程执行任务的结果为:"+task.get());  //阻塞,等待线程执行完毕,获取线程执行结果
    }
}
 

4.4 三种创建多线程的使用场景

1、**继承Thread的方式**:适合于这个任务只想被一个线程的对象执行的情况

2、**实现Runnable接口方式**:适合于一个任务想被多个线程执行的情况. 卖票

3、**实现Callable接口方式**:也适合一个任务想被多个线程执行的情况,你还想得倒任务的执行结果

标签:多线程,Thread,实现,任务,线程,执行,public
From: https://blog.csdn.net/m0_63955162/article/details/145122439

相关文章

  • 2025毕设springboot 非全日制研究生管理系统设计与实现论文+源码
    系统程序文件列表开题报告内容研究背景随着教育改革的深入和终身学习理念的普及,非全日制研究生教育逐渐成为我国高等教育体系中的重要组成部分。非全日制研究生群体因其学习方式的特殊性,如学习时间分散、学习地点灵活等,给高校的教学管理带来了诸多挑战。传统的管理方式已难......
  • 进程、线程,java如何实现多线程任务,Thread里面常用的方法
    1.线程和进程的概述1.1什么是进程正在执行的程序,称为进程。进程是系统分配资源的单元。1.2什么是线程线程又称轻量级的进程,是CPU调度的基本单位,一个进程由一个或多个线程组成进程与进程之间无法共享数据同一个进程的线程与线程之间可以共享数据2.并发与并行的概述并......
  • 基于DPDK的用户态协议栈(2)基于DPDK实现UDP的数据接收
    注:本文只实现了数据接收部分一、使用DPDK实现UDP的数据接收流程1.1初始化EALmain(intargc,char*argv[]){//main函数的标准参数,用于接收命令行参数。argc表示参数的数量,argv是一个指向字符串数组的指针,这些字符串是传递给程序的命令行参数。//初始化EAL。if(......
  • 基于STM32F103标准库实现FFT,并实现音乐频谱绘制
    整个工程文件是在江科大的OLED显示屏OLED-V2.0版本IIC四针脚接口UTF-8的工程上编写的,在屏幕显示过程中,只用到了OLED显示屏的绘制直线和绘制像素点两个函数(注意,显示屏的绘制函数坐标可以任意指定,而不是按页写入。任一屏幕只要有上述两个函数均可使用。工程接线:STM32F103C8T6......
  • keycloak~巧用client-scope实现token字段和userinfo接口的授权
    keycloak中的client-scope允许你为每个客户端分配scope,而scope就是授权范围,它直接影响了token中的内容,及userinfo端点可以获取到的用户信息,这块我们可以通过自定义scope/mapper,来实现粒度的控制,并且这个mapper可以控制添加到token,或者添加到userinfo端点,这两块配置也是独立的,下面......
  • 《深入理解Mybatis原理》Mybatis中的缓存实现原理
    一级缓存实现什么是一级缓存?为什么使用一级缓存?每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据......
  • 打破部门墙,实现跨部门合作的的4种途径
    跨部门协作是企业的日常,也是甩锅的高发地:“告诉我们太晚了,设计根本来不及”“项目延期问我干啥,问研发去啊”……这体现的是我们不重视协同,也不够了解其他部门的工作,这种误解有多深?看了下面这个部门鄙视链就知道了......
  • qiankun微前端——接入子应用Vue3+vite实现
    qiankun:乾坤微前端框架什么是微前端Techniques,strategiesandrecipesforbuildingamodernwebappwithmultipleteamsthatcanshipfeaturesindependently.–MicroFrontends微前端是一种多个团队通过独立发布功能的方式来共同构建现代化web应用的技术......
  • 毕业设计 基于Java的网上书城的设计与实现
    源码获取欢迎留言一、摘要本论文旨在通过对网上书城系统的设计与实现,探讨Java语言在电子商务应用中的优势以及系统的性能与用户体验。随着互联网的快速发展,电子商务已经成为现代商业活动中不可或缺的一部分。网上书城作为电子商务的重要形式之一,其设计与实现具有重要意义。......
  • 【附源码】springboot 高校教师工作量管理系统设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......