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

Java-线程线程的创建方式

一.进程和线程

进程:进程是资源分配的基本单位,每个进程都有自己独立的内存空间,可以看作是一个正在运行的程序实例

线程:线程是CPU调度的基本单位,属于进程,一个进程可以包含多个线程。线程共享进程的内存空间和资源,但每个线程有自己独立的栈和寄存器

多进程:在操作系统中,同时运行多个程序

多进程的好处:可以充分利用CPU,提高CPU的使用率

多线程:在同一个进程(应用程序)中同时执行多个线程

多线程的好处:提高进程的执行使用率,提高了CPU的使用率

注意:

  1. 在同一个时间点一个CPU中只可能有一个线程在执行

  2. 多线程不能提高效率、反而会降低效率,但是可以提高CPU的使用率

  3. 一个进程如果有多条执行路径,则称为多线程程序

  4. Java虚拟机的启动至少开启了两条线程,主线程和垃圾回收线程

  5. 一个线程可以理解为进程的子任务

二.线程的实现方式

1.继承Thread类

注意:

  1. 启动线程是使用start方法而不是run方法

  2. 线程不能启动多次,如果要创建多个线程,那么就需要创建多个Thread对象

class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread running by extending Thread class");}
}public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start();}
}

2.实现Runable接口

实现Runable接口的好处:

  1. 可以避免Java单继承带来的局限性

  2. 适合多个相同的程序代码处理同一个资源的情况,把线程同程序的代码和数据有效的分离,在实现解耦的同时,较好的体现了面向对象的设计思想

class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread running by implementing Runnable interface");}
}public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();}
}

3.实现Callable接口

前面两种方式都是重写run方法,而run方法没有返回结果,也不能抛出异常,main方法不知道线程什么时候开启和结束,也不知道返回值。

所以在jdk1.5引入实现Callable接口的方式创建线程,即可以获取返回值,也可以抛出异常

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "Thread running by implementing Callable interface";}
}public class Main {public static void main(String[] args) throws Exception {FutureTask<String> futureTask = new FutureTask<>(new MyCallable());Thread thread = new Thread(futureTask);thread.start();System.out.println(futureTask.get());}
}
http://www.xdnf.cn/news/17324.html

相关文章:

  • 【线性代数】线性方程组与矩阵——(3)线性方程组解的结构
  • kubectl get node k8s-node01 -o yaml | grep taint -B 5 -A 5
  • 电子电气架构 --- 48V车载供电架构
  • 第16届蓝桥杯Scratch选拔赛初级及中级(STEMA)2024年11月24日真题
  • 阿里Qwen-Image本地部署详细指南
  • SAP在越南投资1.75亿美元建设研发中心
  • 多线程(四) --- 线程安全问题
  • JS逆向实战案例之----【通姆】252个webpack模块自吐
  • jQuery 零基础学习第一天
  • 进阶向:Python编写网页爬虫抓取数据
  • PG靶机 - Shiftdel
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(15):文法+单词第5回
  • 99-基于Python的京东手机数据分析及预测系统
  • 母线电压采样芯片的四大类——汽车级选型对比表
  • git查看单个文件的所有修改记录
  • 105-基于Flask的珍爱网相亲数据可视化分析系统
  • ubuntu修改密码
  • SQL 172 未完成试卷数大于1的有效用户
  • 【高等数学】第八章 向量代数与空间解析几何——第四节 空间直线及其方程
  • EPI2ME分析软件测试
  • 数字图像处理基础——opencv库(Python)
  • 我用C++和零拷贝重构了文件服务器,性能飙升3倍,CPU占用降低80%
  • 从“人拉肩扛”到“智能协同”——AGV重构消防智能仓储价值链
  • 记录一次ubuntu20.04 解决gmock not found问题的过程
  • Python如何合并两个Excel文件
  • Web3: DeFi借贷的安全基石, 了解喂价与清算机制的原理与重要性
  • SVN下载及安装(保姆级别)
  • 【华为机试】55. 跳跃游戏
  • SARSA算法详解:从实践到理论的全面解析
  • 小程序难调的组件