当前位置:网站首页>请你说说多线程
请你说说多线程
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();
}边栏推荐
猜你喜欢
随机推荐
MySQL关系型数据库事务的ACID特性与实现方法
CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) 题解
SQL的ROUND函数用法及其实例
opencv实时人脸检测
【Day_12 0507】查找组成一个偶数最接近的两个素数
存储日报-数据湖架构权威指南(使用 Iceberg 和 MinIO)
使用设备树时对应的驱动编程
国标GB28181协议EasyGBS平台兼容老版本收流端口的功能实现
opencv syntax Mat type summary
Leetcode72. 编辑距离
Leetcode75. Color Classification
消息模板占位符的使用
123123123123
Leetcode73. Matrix Zeroing
Tower Defense Shoreline User Agreement
理财产品的月年化收益率怎么算?
一加OnePlus 10RT出现在Geekbench上 产品发布似乎也已临近
Leetcode74. Search 2D Matrix
电商库存系统的防超卖和高并发扣减方案
QPalette调色板、框架色彩填充









