java多线程入门版 四

微信小程序:errno: 600001, errMsg: “uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::E 微信小程序报错uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::ERR_CONNECTION_RESET, custum ip is invalid, didn't find user's ip,wx.uploadFile errno: 600001 errcode:-101 ?微信小程序wx.uploadFile错误,wx.uploadFile 在真机上报下面的错误,调试工具里没有问题,其它接口在真机/调试工具都正常, 阅读详情

一、什么是多线程?

引用网上别人的一段话:

  1. 单进程单线程:一个人在一个桌子上吃菜。
  2. 单进程多线程:多个人在同一个桌子上一起吃菜。
  3. 多进程单线程:多个人每个人在自己的桌子上吃菜。

多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。资源共享就会发生冲突争抢。

使用多线程的优点(相对使用多进程来说):

  1. 进程之间不能共享内存,但线程之间共享内存非常容易。
  2. 系统创建线程所分配的资源相对创建进程而言,代价非常小。

二、Java中实现多线程的3种方法介绍和比较

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口

这三种方法的介绍和比较
1、实现Runnable接口相比继承Thread类有如下优势
1)可以避免由于Java的单继承特性而带来的局限
2)增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的
3)适合多个相同程序代码的线程去处理同一资源的情况
4)线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类

2、实现Runnable接口和实现Callable接口的区别
1)Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的
2)实现Callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程不能返回结果
3)Callable接口的call()方法允许抛出异常,而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛
4)加入线程池运行,Runnable使用ExecutorService的execute方法,Callable使用submit方法
注:Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取返回结果,当不调用此方法时,主线程不会阻塞

三、Runnable、Thread、Callable案例

3.1、第一种实现方法—继承Thread类

继承Thread类,需要覆盖方法 run()方法,在创建Thread类的子类时需要重写 run(),加入线程所要执行的代即可。

 

package cn.huangt.java_learn_notes.multithread;

/**
 * 继承Thread实现多线程
 * @author huangtao
 */
public class ThreadExtends {
    public static void main(String[] args) {
        new MyThread("Thread测试").start();
        new MyThread("Thread测试").start();
    }
}

class MyThread extends Thread{
    
    private String acceptStr;
    
    public MyThread(String acceptStr) {
        this.acceptStr = acceptStr;
    }
    
    public void run() {
        
        for (int i = 0; i < 5; i ++) {
            System.out.println("这个传给我的值:"+acceptStr+",加上一个变量,看看是什么效果:"+i);
        }
    }
}

/*
输出内容===
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:0
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:0
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:1
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:2
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:3
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:4
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:1
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:2
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:3
这个传给我的值:Thread测试,加上一个变量,看看是什么效果:4
*/

3.2、第二种实现方法—实现Runnable接口

如果要实现多继承就得要用implements,Java 提供了接口 java.lang.Runnable 来解决上边的问题。

Runnable是可以共享数据的,多个Thread可以同时加载一个Runnable,当各自Thread获得CPU时间片的时候开始运行Runnable,Runnable里面的资源是被共享的,所以使用Runnable更加的灵活。PS:需要解决共享之后产生的资源竞争问题。

 

package cn.huangt.java_learn_notes.multithread;

/**
 * Runnable接口实现多线程
 * @author huangtao
 */
public class RunnableImpl implements Runnable {

    private String acceptStr;
    
    public RunnableImpl(String acceptStr) {
        this.acceptStr = acceptStr;
    }

    public void run() {
        try {
            // 线程阻塞1秒,此时有异常产生,只能在方法内部消化,无法上抛
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 最终处理结果无法返回
        System.out.println("hello : " + this.acceptStr);
    }

    public static void main(String[] args) {
        Runnable runnable = new RunnableImpl("Runable测试");
        long beginTime = System.currentTimeMillis();
        new Thread(runnable).start();
        long endTime = System.currentTimeMillis();
        
        // endTime 和 beginTime是一样的,线程并不会阻塞主线程
        System.out.println("cast : " + (endTime - beginTime) / 1000 + " second!");
    }
}

/*
输出内容===
cast : 0 second!
hello : Runable测试
*/

3.3、第三种—实现Callable接口

Runnable是执行工作的独立任务,但是它不返回任何值。如果你希望任务在完成的能返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的参数类型表示的是从方法call()(不是run())中返回的值。

 

package cn.huangt.java_learn_notes.multithread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * Callable接口实现多线程
 * @author huangtao
 */
public class CallableImpl implements Callable<String> {
    
    private String acceptStr;
    
    public CallableImpl(String acceptStr) {
        this.acceptStr = acceptStr;
    }

    public String call() throws Exception {
        // 任务阻塞1秒,并且增加一些信息返回
        Thread.sleep(1000);
        return this.acceptStr + " 增加一些字符并返回";
    }
    
    public static void main(String[] args) throws Exception {
        Callable<String> callable = new CallableImpl("Callable测试");
        FutureTask<String> task = new FutureTask<String>(callable);
        // 创建线程
        new Thread(task).start();
        long beginTime = System.currentTimeMillis();
        // 调用get()阻塞主线程,反之,线程不会阻塞
        String result = task.get();
        long endTime = System.currentTimeMillis();
        System.out.println("hello : " + result);
        
        // endTime 和 beginTime是不一样的,因为阻塞了主线程
        System.out.println("cast : " + (endTime - beginTime) / 1000 + " second!");
    }
}

/*
输出内容===
hello : Callable测试 增加一些字符并返回
cast : 1 second!
*/

四、Runnable、Thread、Callable总结

最后再来看看它们三个之间的总结。

4.1、实现Runnable接口相比继承Thread类有如下优势

1)可以避免由于Java的单继承特性而带来的局限
2)增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的
3)适合多个相同程序代码的线程去处理同一资源的情况
4)线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类

4.2、实现Runnable接口和实现Callable接口的区别

1)Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的
2)实现Callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程不能返回结果
3)Callable接口的call()方法允许抛出异常,而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛
4)加入线程池运行,Runnable使用ExecutorService的execute方法,Callable使用submit方法
注:Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取返回结果,当不调用此方法时,主线程不会阻塞。

手把手教你学simulink(36.1)--ACAC变换器场景示例:基于 Simulink 的矩阵变换器(Matrix Converter) 矩阵变换器(Matrix Converter, MC)是一种直接将交流电(AC)转换为不同频率和幅值的交流电的电力电子设备。与传统的基于直流环节的变频器不同,矩阵变换器不需要中间的直流环节,而是通过双向开关直接在输入和输出之间进行能量传递。这种结构使得矩阵变换器具有更高的效率、更小的体积和更好的动态响应。在本项目中,我们将使用 MATLAB/Simulink 来建模和仿真一个矩阵变换器,并分析其性能。Simulink 是一个强大的仿真工具,特别适合用于电力电子系统的建模和仿真。 阅读详情

相关推荐

Matlab实战:3种雷达间歇采样干扰的仿真与识别(附完整代码)

本文通过Matlab实战,详细仿真了雷达有源间歇采样干扰的三种核心样式:直接转发、重复转发和循环转发干扰。文章提供了完整的代码实现,并深入探讨了基于时频分析和循环平稳分析的特征提取与识别方法,为雷达抗干扰技术的学习与实践提供了清晰的工程实现路径。

weixin_29053695的博客 364

Java_线程 Thread类 Runnable接口 多线程原理 线程安全 线程同步机制 线程状态

一.线程 1.概述 线程: 进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以理解为一个进程便相当 于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。 进程: 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多 个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创 建、运行到消亡...

劉某人゜的博客 557

基于NXP1778的CAN自动波特率检测

一、概念 NXP1778芯片内部自带一个CAN控制器。CAN模块由两部分组成:控制器和验收滤波器。所有的寄存器和RAM都以32位字宽度来访问。 CAN自动波特率检测主要用于以一种CAN的转换的产品中。产品中CAN部分的波特率以前都是通过网页中修改然后配置下去的,依据实际情况的考虑,如果CAN部分的波特率能够根据客户设备的改变而自动改变,将会增加其灵活性。   二、原理 根据CAN控制器的

菜鸟的痕迹专栏 5275

FutureTask的用法及两种常用的使用场景

1、看视频进行系统学习这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。2、读源码,看实战笔记,学习大神思路“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。

2401_84413657的博客 581

基于CNN对抗嵌入的图像隐写——CNN-Based Adversarial Embedding for Image Steganography

CNN-Based Adversarial Embedding for Image Steganography https://ieeexplore.ieee.org/abstract/document/8603808 这篇论文发表在TIFS( IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY),TIFS是网络与信息安全领域的国际两大顶级期刊之一,中国计算机学会(CCF)推荐的A类期刊,SCI一区TOP期刊,目前影响因子有7多了。 1 概

weixin_48654804的博客 2279

相机基础知识讲解:CMOS和CCD

相机基础知识讲解:CMOS和CCD

Coppa的博客 5万+

线程的四种实现方式

1.继承Thread类 一个类继承Thread类,重写run()方法,调用Thread类中的start()方法启动线程。 2.实现Runnable类 自定义类实现Runnable接口,重写run()方法;用实现Runnable接口的对象作为参数实例化一个Thread对象,调用Thread类的start()方法来启动线程 实现Runnable接口比继承Thread类所具有的优势: 1. 适合多个相同的程序代码的线程去共享同一个资源。 2. 可以避免java中的单继承的局限性。 3...

weixin_46217160的博客 9768

SAP Business One自定义表与字段实战:从零构建企业专属数据模型

本文详细介绍了如何在SAP Business One中创建自定义表与字段,从零构建企业专属数据模型。通过实战案例和避坑指南,帮助用户掌握业务适配、流程优化和权限隔离等关键技巧,提升系统灵活性和数据管理效率。特别适合需要扩展标准功能的SAP Business One用户。

weixin_28730927的博客 365

Java基础----【线程、同步】

主要内容 线程 同步 线程状态 第一章 线程 1.1 多线程原理 昨天的时候我们已经写过一版多线程的代码,很多同学对原理不是很清楚,那么我们今天先画个多线程执行时序图来体现一下多线程程序的执行流程。 代码如下: 自定义线程类: public class MyThread extends Thread { public MyThread(String name) { /...

CoderBoom的博客 315

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1253

CMake入门教程【基础篇】在Windows、Linux上安装CMake

CMake如何下载与安装

小鱼酱的博客 2727

【多线程】线程与同步

故事 A 747 was halfway across the Atlantic when the captain got on the loud speaker, “Attention, passengers. We have lost one of our engines, but we can certainly reach London with the three we have lef...

丢失了名字的琥珀川 328

AI测试干货:Claude Code Skill 从入门到精通

本文介绍了Claude Code Skill功能如何解决AI重复工作问题。传统提示词方式需要人工复制粘贴,而Skill功能通过建立AI工作记忆库实现智能触发和分层加载。Skill包含工作指令、文档和资源,能自动执行任务。文章以API测试用例生成为例,展示了Skill的创建流程和结构化设计,包括测试框架、覆盖场景和输出格式,显著提升测试工程师的工作效率。

blues_C的博客 2445

这篇文章就是要让你入门java多线程【多线程入门】

就在前几天,有位朋友私信宜春,说期待出一篇多线程的文章,我当时内心是小鹿乱撞啊....于是这几天茶不思饭不想,好几天深夜皆是辗转反侧,两目深凝,以至于这几天走起路来格外飘飘然~我承认太夸张了,感觉又要被打~。最终还是君意不可违,答应了这位朋友,从这位朋友的头像可以看出来,这位朋友绝bi历经沧桑,对生活无尽的坦然浩对,看透俗世凡尘、世态炎凉、趋炎附势,拥有着极高的安心恬荡情怀...啥?啥子?这个是系统默认头像....那个那个宜春啥都没说哈,别把什么事都扯宜春身上,我啥都没说。。。。

宜春 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【hacker送书第8期】Java从入门到精通(第7版)

【hacker送书第8期】Java从入门到精通(第7版),欢迎大家参与!!!

hacker707的博客 9656

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java(多线程入门)

学习一下入门级的多线程 学习多线程,先了解什么叫线程,什么叫进程 一般我们运行的程序都是进程级的,就是运行一个进程的意思,进程之下还有一群小弟叫线程,多个进程可以同时运作,多个线程也可以,但是一般我们只认识大哥,就是进程,所以用户一般不纠结这个,但是开发人员就不一样了,得知道,一个进程其实内部还有若干个线程,一般最少会有一个主线程,在java里对应的是main方法开启的main线程,这一段要强调的...

awei的blog 3150

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java多线程详解(一)Java多线程入门

最近听很多面试的小伙伴说,网上往往是一篇一篇的Java多线程的文章,除了书籍没有什么学习多线程的一系列文章。但是仅仅凭借一两篇文章很难对多线程有系统的学习,而且面试的时候多线程这方面的知识往往也是考察的重点,所以考虑之下决定写一系列关于Java多线程的文章。文章参考了高老师的《Java多线程编程核心技术》。力争使用最短的篇幅把Java多线程的知识作以系统的讲述。 本节思维导图: 思维导图...

刘成 2475

Java多线程入门

线程是程序执行流的最小单元,是 CPU 调度和分派的基本单位。一个进程可以包含多个线程。往底层一点说,线程是CPU和内存之间提取代码的一个通道本文介绍了 Java 多线程的基础知识,包括线程和多线程的概念、创建线程的方式以及线程同步等内容。通过学习这些基础知识,你可以开始编写简单的多线程程序。在实际开发中,多线程编程还涉及到更多的高级知识,如线程池、并发集合等,需要进一步深入学习。

2401_86909484的博客 872

Java 多线程 -- 从入门到精通

Java 多线程 -- 从入门到精通Java线程与线程的区别多线程的实现方法Thread中start和run方法的区别Thread和Runnable的关系使用Callable和Future创建线程线程返回值的处理方法线程的六个状态线程不安全解决线程不安全(synchronized)sleep和wait的区别 Java线程与线程的区别 线程是CPU调度的最小单位,进程是资源分配的最小单位。 多线程的实现方法 继承Thread类,重写run方法 实现Runnable接口,重写run方法 通过Callable和

程序员小哲的博客 6624

《Java从入门到放弃》JavaSE入门篇:多线程(入门版)

学习多线程之前,我们先搞清楚,为什么要使用多线程?~~Look 这就是标准的多线程的使用场景。一个锅可以同时煮多个菜,同一时间能有多个人在锅里夹菜。 小结:多线程的目的,就是为了解决需要同时运行多个任务的场合。 按官方的说法,多线程帮助你写出CPU最大利用率的高效程序,因为空闲时间保持最低,这对Java运行的交互式的网络互连环境是至关重要的,例如:网络的数据传输速率远低于计算机的处...

十方上下 1071

电子书 Java从入门到精通第4版.pdf

《Java从入门到精通(第4版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识。全书分为28章,包括初识Java,熟悉Eclipse开发工具,Java语言基础,流程控制,字符串,数组,类和对象,包装类,数字处理类,接口、继承与多态,类的高级特性,异常处理,Swing程序设计,集合类,I/O(输入/输出),反射,枚举类型与泛...

软件测试博客 3657

【Java并发】多线程的入门与理解

Java并发 -- 多线程的入门与理解

2403_87459748的博客 1690

【hacker送书第8期】Java从入门到精通(第7版)(1)

Java从入门到精通(第7版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细讲解了使用Java语言进行程序开发需要掌握的知识。全书分为4篇共24章,内容包括。

2401_84264583的博客 1201

基于Java+socket实现多线程聊天室-控制台版

首先启动server端,然后启动client端。任意一个client发送给server的消息都将会被转发给所有在线的client,实现了一个聊天室功能。client发送exit指令可以下线,所有的client端,以及server端都会收到它的下线通知。原理socket 通信是基于TCP/IP 网络层上的一种传送方式。

pangjiaqian的博客 1000

Java多线程从入门到精通

是指运行中的程序。比如我们使用浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某个片段。

云想衣裳花想容,春风拂槛露华浓 987

Java多线程(四)

线程组 线程组:Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。默认情况下,所有的线程都属于主线程组。 public final ThreadGroup getThreadGroup():获取线程对应的线程组对象,我们也可以给线程设置分组。 Thread(ThreadGroup group, Runnable target) 案...

Veer_c的博客 6872
上一篇: java多线程入门版 三
下一篇: Java版Kafka使用及配置解释
Computer_hello
博客等级 码龄10年 2粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值