当前位置: 首页 > news >正文

Java 多线程的基本概念及实现方式

一 基本概念

程序:

Java源程序和字节码文件被称为“程序” (Program),是一个静态的概念。

进程:

执行中的程序叫做进程(Process),是一个动态的概念。

线程:

线程是独立调度和分派的基本单位,共享进程资源。每一个线程会有一个独立的栈.

进程与程序:

§ 进程是程序的一部分,程序运行的时候会产生一个或多个进程。

§ 多进程: 在操作系统中能同时运行多个任务(程序)

§ 多线程: 在同一应用程序中有多个顺序流同时执行

§ 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。

§ 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。

§ 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,除了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。

Java 多线程的基本概念及实现方式

进程与线程:

线程和进程最根本的区别在于:进程作为资源分配的单位,线程是调度和执行的单位

二 实现多线程的方法

第一种方法:

[java] view plain copy

  1. package com.gdzy.ThreadTest;
  2. /**
  3. * 多线程实现的第一种方式:
  4. * 新建一个类继承java.lang.Thread类, 重写run方法. 此类代表一个新的线程
  5. */
  6. public class ThreadTest01 {
  7. public static void main(String[] args){
  8. MyThread01 t1 = new MyThread01();
  9. t1.start();
  10. for(int i=0; i<100; i++){ //建立一个for循环,表示main线程的进行
  11. System.out.println("main线程++++++++"+i);
  12. }
  13. }
  14. }
  15. class MyThread01 extends Thread{
  16. @Override
  17. public void run(){ //重写run方法
  18. for(int i=0; i<100; i++){ //建立一个for循环,表示MyThread01线程的进行
  19. System.out.println("MyThread01线程-----"+i);
  20. }
  21. }
  22. }

第二种方法:

[java] view plain copy

  1. package com.gdzy.ThreadTest;
  2. /**
  3. * 多线程的第二种实现方式
  4. * 1.新定义一个类(新的线程),实现Runnable接口, 重写run方法.
  5. * 2.在主程序中实例化这个类.
  6. * 3.利用Thread有参构造构造函数, 将Runnable一个实例传入, 这个引用才可以使用start方法.
  7. *
  8. *
  9. */
  10. public class ThreadTest02 {
  11. public static void main(String[] args){
  12. MyThread02 t2 = new MyThread02();
  13. Thread tt = new Thread(t2);
  14. tt.start();
  15. for(int i=0; i<100; i++){
  16. System.out.println("main线程输出+++++++"+i);
  17. }
  18. }
  19. }
  20. class MyThread02 implements Runnable{
  21. public void run() {
  22. for(int i=0; i<100; i++){
  23. System.out.println("MyThread02线程输出----"+i);
  24. }
  25. }
  26. }

推荐使用实现Runnable接口的方式,原因如下:

1.保留了类的继承权

2.适合多个相同的程序代码去处理同一个资源

3.增加程序的健壮性,代码可以被多个线程共享.代码和数据独立

如果对java微服务、分布式、高并发、高可用、大型互联网架构技术以及大数据等技术,可以关注私信我哈。

相关文章:

  • 定义和声明的区别和联系
  • 沈向洋博士致2018届毕业生的公开信:计算机科学的三堂人生课
  • vuex从安装到使用的教程
  • ZOJ-2770 Burn the Linked Camp 差分约束
  • 中国AI专利增长领先美国!拼专利这条路能不能走通?
  • [书目20130316]jQuery UI开发指南
  • K8s创建pod yaml文件详解
  • Sql Server系列:开发存储过程
  • 学Java的能从事前端吗?
  • Find INTCOL#=1001 in col_usage$?
  • 比特币的矿工为什么讨厌开发组Core?
  • 有哪些功能是DBMS_STATS无法实现而Analyze命令可以做到的?
  • Kafka 1.1新功能:数据的路径间迁移
  • Toast 学习
  • AutoCAD 命令统计魔幻球的实现过程--(3)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • 78. Subsets
  • Angular 4.x 动态创建组件
  • codis proxy处理流程
  • ES6系统学习----从Apollo Client看解构赋值
  • HomeBrew常规使用教程
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JWT究竟是什么呢?
  • Python中eval与exec的使用及区别
  • React-生命周期杂记
  • SpiderData 2019年2月13日 DApp数据排行榜
  • storm drpc实例
  • Webpack入门之遇到的那些坑,系列示例Demo
  • windows-nginx-https-本地配置
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从PHP迁移至Golang - 基础篇
  • 电商搜索引擎的架构设计和性能优化
  • 浮动相关
  • 你真的知道 == 和 equals 的区别吗?
  • 前端自动化解决方案
  • 前嗅ForeSpider教程:创建模板
  • 一份游戏开发学习路线
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • Linux权限管理(week1_day5)--技术流ken
  • #QT(串口助手-界面)
  • #在 README.md 中生成项目目录结构
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (十)T检验-第一部分
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)Linux+Windows下安装ffmpeg
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)创业的注意事项
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 使用ajax控件后如何调用前端脚本
  • .NET运行机制
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @DependsOn:解析 Spring 中的依赖关系之艺术