java多线程异步调用别的系统接口代码_60 多个实例讲解,彻底搞懂 Java 多线程!
![](http://p03.5ceimg.com/content/412f9fae-3514-eb11-8da9-e4434bdf6706.png)
JAVA 最难学的部分是哪里?很多朋友都会说:「 java 多线程 」。
随着业务量和数据的增加,企业不可避免地会使用多线程的方式处理数据。在 Java 职位的面试中,多线程也是必考的高阶知识点之一。可以说,java多线程是衡量一名 Java 程序员是否资深的关键标准之一。
今天,我们就来学习一下 Java 多线程的概念吧!
(点击课程链接,开启实验环境,边学边练才是更有效的学习方式)
Java 多线程技术实战www.shiyanlou.com
![](http://p05.5ceimg.com/content/422f9fae-3514-eb11-8da9-e4434bdf6706.png)
多进程与多线程的概念
初步创建多线程,理清多线程的概念。
知识点
- 多线程的概念
- 创建多线程 —— 继承 Thread
- 创建多线程 —— 实现 Runnable
- 创建多线程 —— 实现 Callable
多进程和多线程的概念
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。凡是用于完成操作系统的各种功能的进程就是系统进程,而所有由你启动的进程都是用户进程。
多进程
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。凡是用于完成操作系统的各种功能的进程就是系统进程,而所有由你启动的进程都是用户进程。
![](http://p01.5ceimg.com/content/432f9fae-3514-eb11-8da9-e4434bdf6706.png)
如图所示每一个正在运行的 .exe
程序都是一个进程。
多线程
进程就是有一个或多个线程构成的。而线程是进程中的实际运行单位,是独立运行于进程之中的子任务。是操作系统进行运算调度的最小单位。可理解为线程是进程中的一个最小运行单元。
进程和线程之间的关系
一个进程下包含 N 个线程。
举例说明:玩英雄联盟的时候,打开客户端便启动了许多个线程:排队队列线程、好友聊天线程、正在支付线程。在英雄联盟这一个进程之下便启动了 N 个线程。
我们初学 java 边写代码的时候,通常使用 main 方法进行运行,此时 main 方法执行的便是一个主线程,而所谓的多线程,即是在主线程执行的过程中,同时执行其他的线程。但是同时执行多个线程容易出现报错现象,例如同时同分同秒,两个线程同时修改一个 txt、数据库表文件,或第一个线程没有修改完 txt、数据库表文件,第二个线程同时也去修改。这便是线程之间的混乱、资源竞争、脏读,便是程序员需要去解决的疑难杂症。
创建多线程 —— 继承 Thread
java 世界中有两种方式创建多线程:
java 世界中有两种方式创建多线程,分别是继承 Thread 类,实现 Runnable 接口。
继承 Thread 类方式创建多线程
第一步:在 webide 上右键单击菜单,选择 New File 创建新文件。
![](http://p02.5ceimg.com/content/442f9fae-3514-eb11-8da9-e4434bdf6706.png)
第二步:创建文件名为 test0.java
![](http://p04.5ceimg.com/content/452f9fae-3514-eb11-8da9-e4434bdf6706.png)
第三步:编写 test0.java
中继承 Thread 类方式创建多线程的代码如下所示:
public class test0 {public static void main(String[] args) {Thread MyThread = new MyThread();MyThread.start();}
}class MyThread extends Thread {@Overridepublic void run() {System.out.println("hello myThread" + Thread.currentThread().getName());}
}
第四步:编译 test0.java
代码:
javac test0.java
![](http://p05.5ceimg.com/content/492f9fae-3514-eb11-8da9-e4434bdf6706.png)
编译之后,会产生我们所编写的 test0 类与 MyThread 类
![](http://p05.5ceimg.com/content/4a2f9fae-3514-eb11-8da9-e4434bdf6706.png)
第五步:运行 test 代码:java test0
![](http://p03.5ceimg.com/content/4b2f9fae-3514-eb11-8da9-e4434bdf6706.png)
创建多线程 —— 实现 Runnable
只需要把《创建多线程 —— 继承 Thread》中代码修改成如下所示即可,其它操作不变:
public class test0 {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();}
}class MyRunnable implements Runnable{@Overridepublic void run(){System.out.println("hello myRunnable" + Thread.currentThread().getName());}
}
执行结果如下所示:
![](http://p03.5ceimg.com/content/4d2f9fae-3514-eb11-8da9-e4434bdf6706.png)
通常情况下,如果创建的线程类已经含有父类时候,此时由于 Java 语法结构不支持多继承的原因,不能够再次继承 Thread 类,此时则需要使用实现 Runnable 接口的方式来应对如此场景。另外值得说明的是,Thread 类也实现了 Runnable 接口。
![](http://p03.5ceimg.com/content/4e2f9fae-3514-eb11-8da9-e4434bdf6706.png)
实现多线程传参 —— 有参构造
由于多线程是由继承 Thread
或实现 Runnable
并重写 run()
方法,通过 thread.start()
进行运行的,而本身重写的 run()
方法是不具备传参能力的,那我新建的线程就接受不到我所想传入的参数了么?
创建 study1.java
文件
class ThreadA extends Thread{private String age;public ThreadA(String age){this.age = age;}@Overridepublic void run() {System.out.println("age=" + age);}
}public class study1 {public static void main(String[] args) {String age = new String("12");ThreadA a = new ThreadA(age);a.start();}
}
无论 extendsThread
还是 implementsRunnable
,传参都需要使用线程初始化的有参构造形式,达到多线程传参的目的。也可以做到重载有参构造,传入各式对象。
study1 运行结果
![](http://p04.5ceimg.com/content/4f2f9fae-3514-eb11-8da9-e4434bdf6706.png)
实现多线程返回值 —— 实现 Callable<V>
通常意义上理解确实 Java 实现多线程的方式有继承 Thread
和实现 Runnable
,但是如果想实现多线程并且具有返回值的情况下,需要实现 Callable<V>
接口,这个接口是 JDK1.5
版本以后才出现的接口。
创建 study2.java
创建 study2.java
文件,利用实现 Callable<V>
进行返回,代码如下所示:
import java.util.concurrent.Callable;public class study2 {public static void main(String[] args) {MyCallable MyCallable = new MyCallable("张方兴");String call = null;try {call = MyCallable.call();} catch (Exception e) {e.printStackTrace();}System.out.println(call);}
}class MyCallable implements Callable<String>{private String name;public MyCallable(String name) {this.name = name;}@Overridepublic String call() throws Exception {return "call:" + name;}
}
study2 运行结果
![](http://p01.5ceimg.com/content/502f9fae-3514-eb11-8da9-e4434bdf6706.png)
Callable<V>
接口详解
一般继承 Thread
的类,含有 .start()
函数,所以直接可以使用 .start()
函数进行启动。实现 Runnable
的类,需要通过 newThread(myRunnable).start();
的方式进行启动,即实现 Runnable
的类只是做好了一段多线程所需执行的内容,自身并没有执行的能力,需要通过 Thread
类的 .start()
函数进行启动。实现 Callable<V>
的接口,含有 .call()
函数,所以可以直接使用 .call()
函数进行启动,另外值得说明的是, Callable<V>
函数具有返回值,返回值为定义类时使用的 <V>
类型,其定义是其返回。 Callable<V>
接口定义如下所示:
@FunctionalInterface
public interface Callable<V> {/*** Computes a result, or throws an exception if unable to do so.** @return computed result* @throws Exception if unable to compute a result*/V call() throws Exception;
}
Callable<V>
用于指示接口类型声明是由 Java 语言规范定义的功能接口。从概念上讲,函数接口只有一个抽象方法。因为 java.lang.reflect.Method#isDefault()default methods
有一个实现,所以它们不是抽象的。如果接口声明一个抽象方法重写 java.lang.Object
的一个公共方法,则该方法也不计入接口的抽象方法计数,因为接口的任何实现都将具有来自 java.lang.Object
或其他位置的实现。另外注意,函数接口的实例可以使用 lambda 表达式、方法引用或构造函数引用创建。
Callable<V>
在需要使用返回值的情况下,程序是同步运行的Callable<V>
。其它情况下,程序是异步运行的
完整课程内容,请在实验楼边操作边学习。
Java 多线程技术实战www.shiyanlou.com
![](http://p05.5ceimg.com/content/422f9fae-3514-eb11-8da9-e4434bdf6706.png)
java多线程异步调用别的系统接口代码_60 多个实例讲解,彻底搞懂 Java 多线程!相关推荐
- java多线程异步调用别的系统接口代码_抢先准备,40个 Java 多线程面试题及答案大汇总!...
↑↑↑点上方蓝字关注并标⭐「IT技术思维」 一起培养顶尖技术思维 来源:程序员共成长(id:finishbug) 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有 ...
- JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...
本文通过实例讲解给大家介绍Java中for.while.do while三种循环语句的区别,具体详情如下所示: 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后 ...
- java 多异步调用_java 异步调用与多线程
异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾 ...
- java短信接口_java调用短信接口代码
原标题:java调用短信接口代码 短信接口被广泛应用在网站.app应用以及软件系统中,如用户注册.密码找回.会员服务.系统消息通知等应用场景,那么如何调用短信接口呢?下面以java开发语言为例,为大家 ...
- java http异步调用_HttpClient的异步调用,你造吗?
一.前言 HttpClient提供了两种I/O模型:经典的java阻塞I/O模型和基于Java NIO的异步非阻塞事件驱动I/O模型. Java中的阻塞I/O是一种高效.便捷的I/O模型,非常适合并发 ...
- 【javaWeb微服务架构项目——乐优商城day15】——会调用订单系统接口,实现订单结算功能,实现微信支付功能
0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 源码笔记及资料: 链接:https://pan.baidu.com/s/1_opfL63P1pzH3rzLnbFiNw 提取码:v ...
- 最简单的 post 请求发起方式、调用其它系统接口
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 调用其它系统接口,发起一个 post 请求,写法如下: import cn.com.infinit ...
- java开发可重用代码包工具包_[Java教程]彻底搞懂Java开发工具包(JDK)安装及环境变量配置...
[Java教程]彻底搞懂Java开发工具包(JDK)安装及环境变量配置 0 2021-01-04 04:00:04 安装并配置JDK环境变量,不但要知道怎样做,也要知道为什么这样做,知其然知其所以然. ...
- JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系
文章目录 Pre 示例demo 总体关系 代码示例论证 反汇编 Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家 ...
最新文章
- 程序员:我不学Python了!!
- 2012r2备域控服务器搭建,Windows2012R2备用域控搭建
- 教你如何反编译Android安装文件apk来偷窥源代码
- ${}和#{}的区别
- linux++命令+q,linux 命令 - osc_panqs2jh的个人空间 - OSCHINA - 中文开源技术交流社区...
- 完美世界2020编程题-救雅典娜 英雄AB PK
- EMC测试仪器_智芯文库 | 单片机系统EMC测试和故障排除
- jsp页面之间传中文参数显示乱码问题的解决
- 编程语言 - 大数据 - Hadoop
- 【微信读书】《我不过低配的人生》- 雾拦满江 读书笔记
- MMKV_MMKV - 由微信开发的高效,小巧的移动端key-value存储框架,适用于iOS和Android...
- OpenTCS 之 DefaultDispatcher 默认调度算法
- C# XmlDocument.Save文件操作System.IO.IOException:The process cannot access the file because it is being
- NPOI遍历excel表格
- 检查型异常有哪些java_JAVA系列之检查型异常与非检查型异常的详解
- 计算机网络课制作双绞线实验,计算机网络实验一(双绞线的制作)
- 元气骑士怎么用电脑玩 元气骑士手游模拟器教程
- IOS开发之——QQ主流框架(64)
- 横屏模式下,编辑手机联系人添加图片,保存后联系人头像与之前默认的图片重叠或者是有阴影在头像上
- Win10系统安装office2019和Visio2019
热门文章
- 解决IE8不支持数组的indexOf方法
- 2009.12.9.工作日记
- altas(ajax)控件(二):悬浮面板控件AlwaysVisibleControl
- error LNK2005: void * __cdecl operator new(unsigned int) (??2@YAPAXI@Z) already defined in LIBCMT.
- 矩阵乘法的本质(线性空间篇,知乎:马同学)
- 相似性度量:机器学习距离公式总结
- 随机获取一个集合(List, Set,Map)中的元素转
- MVC之LayOut布局页
- CSS3制作动画的三个属性
- SQLServer查询所有表所有字段包含xx的信息