当前位置:网站首页>请你说说多线程
请你说说多线程
2022-08-01 18:12:00 【去扰嶟】
什么是进程
- 程序是用来解决问题、用某种语言编写的静态代码。
- 进程是运行的程序,是动态的,会由计算机分配内存和资源。
- 线程进程可进一步细分为线程,是一个程序内部的一条执行路径。
- 如果一个进程同一时间并行执行多个线程,就是支持多线程的。
- 线程是操作系统调度和执行的最小单元,每个线程拥有独立的运行栈和程序计数器。
- 一个进程中的多个线程共享相同的内存单元-->它们从同一堆中分配对象,可以访问相同的对象和变量。这就使得线程间的通信更简便、高效。但多个线程操作共享的系统资源可能就会带来安全隐患(进程安全问题)。
多线程的优点
1.提高了计算机系统CPU的利用率;
2.提高应用程序的响应。对图形化界面更有意义,可增强用户体验;
3.改善程序结构。将即长又复杂的进程分为多个线程,独立运行,方便了理解和维护。同时Java为多线程提供了良好而一致的编程模型,使开发人员能够更加专注于问题的修改,开发者只需为此问题建立合适的业务模型,而无需绞尽脑汁地考虑如何实现多线程。一旦开发者建立好了业务模型,稍作修改就可以将其方便地映射到Java提供的多线程编程模型上。
适合使用多线程的情况
1.程序需要同时执行两份或多个任务;
2程序需要实现一些需要等待的任务时,如用户输入、文件读写、网络操作、搜索等;
3.需要一些后台运行的程序时。
Java中如何使用多线程(4种方式)
1.继承Thread类
public class Thread1 extends java.lang.Thread {
public Thread1() {
}
public Thread1(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
/*currentThread():Returns a reference to the currently executing thread object.
-返回当前正在执行的线程对象的引用。
Returns:the currently executing thread
-返回:当前执行的线程
*/
System.out.println(currentThread().getName());
}
}
}
//测试方法
@Test
public void testThread1() {
Thread1 thread1 = new Thread1("first");
thread1.start();
}
2.实现Runnable类
//多线程实现方式2:继承java.lang.Thread类,再重写run()方法
public class Thread2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(currentThread().getName());
}
}
}
//测试方法
@Test
public void testThread2() {
Thread2 thread = new Thread2();
Thread Thread1 = new Thread(thread);
Thread Thread2 = new Thread(thread);
Thread1.start();
Thread2.start();
}
3.实现Callable类
//实现Callable接口并重写call()方法,在使用时与FutureTask配合使用。
public class Thread3 implements Callable {
@Override
public Object call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(currentThread().getName());
}
return null;
}
}
//测试方法
@Test
public void testThread3(){
Thread3 thread1 = new Thread3();
Thread3 thread2 = new Thread3();
FutureTask futureTask1 = new FutureTask(thread1);
FutureTask futureTask2 = new FutureTask(thread2);
new Thread(futureTask1).start();
new Thread(futureTask2).start();
}
4.使用进程池
@Test
public void testThread4() {
ExecutorService service = Executors.newFixedThreadPool(10);
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) service;
// 设置核心线程数
threadPoolExecutor.setCorePoolSize(10);
//设置线程在终止之前可能保持空闲的时间限制。
threadPoolExecutor.setKeepAliveTime(1000, MILLISECONDS);
//execute()参数是实现了runnable接口的类的对象
service.execute(new Thread2());
service.execute(new Thread2());
// submit()方法参数是实现了callable接口的类的对象
service.submit(new Thread3());
service.submit(new Thread3());
//shutdown():启动有序关闭,其中执行先前提交的任务,但不会接受新任务。 如果已经关闭,调用没有额外的效果。
service.shutdown();
}
边栏推荐
- 123123123123
- 使用设备树时对应的驱动编程
- How to solve the dynamic binding of el-form-item prop attribute does not take effect
- bat 批示处理详解-2
- C#/VB.NET:从 PDF 文档中提取所有表格
- University of California | Inverse Reinforcement Learning from Different Third-Person Videos via Graph Abstraction
- OpenCV安装、QT、VS配置项目设置
- 行业沙龙第二期丨如何通过供应链数字化业务协同,赋能化工企业降本增效?
- C#/VB.NET: extracted from the PDF document all form
- Leetcode73. Matrix Zeroing
猜你喜欢
8月微软技术课程,欢迎参与
【Day_11 0506】 最近公共祖先
opencv如何实现图像倾斜校正
Zabbix6.0钉钉机器人告警
B002 - Embedded Elderly Positioning Tracking Monitor
关于单应性矩阵的若干思考
Leetcode71. Simplified Paths
LeetCode 0152. 乘积最大子数组:dp + 原地滚动
QT basic functions, signals, slots
How to solve the dynamic binding of el-form-item prop attribute does not take effect
随机推荐
亚马逊云科技Build On2022技能提升计划第二季——揭秘出海爆款新物种背后的黑科技
Review实战经典:2 种封装风格,你偏爱哪种?
小贝拉机器人是朋友_普渡科技召开新品发布会,新一代送餐机器人“贝拉”温暖登场...
Go GORM事务实例分析
SQL窗口函数
COS 用户实践征文
How opencv implements image skew correction
7月30号|来一场手把手助您打造智能视觉新爆款的技术动手实验
C#/VB.NET:从 PDF 文档中提取所有表格
【Day_11 0506】求最大连续bit数
行业沙龙第二期丨如何通过供应链数字化业务协同,赋能化工企业降本增效?
SQL函数 TO_DATE(二)
GTK修改pixmap像素,提取pixmap像素RGB值
计算IoU(D2L)
The function realization of the national standard GB28181 protocol EasyGBS platform compatible with the old version of the inflow port
Stop using MySQL online DDL
LeetCode 0151.颠倒字符串中的单词
三维空间中点的插值
QLineEdit学习与使用
史上最全的Redis基础+进阶项目实战总结笔记