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

ftp 网站管理/找平台推广

ftp 网站管理,找平台推广,只做鱼网站,帮别人做网站如何备案以下是关于Java多线程的详细介绍,适合作为知识博客的内容。我将从基础概念开始,逐步深入到分布式场景、线程池配置以及Spring Cloud集成等高级主题,并提供丰富的业务场景示例。 Java多线程核心概念 1. 线程与进程的区别 进程:程…

以下是关于Java多线程的详细介绍,适合作为知识博客的内容。我将从基础概念开始,逐步深入到分布式场景、线程池配置以及Spring Cloud集成等高级主题,并提供丰富的业务场景示例。

Java多线程核心概念

1. 线程与进程的区别
  • 进程:程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。
  • 线程:进程中的一个执行单元,是CPU调度和分派的基本单位。一个进程可以包含多个线程。
2. 线程安全性

当多个线程访问共享资源时,若不采取同步措施,可能导致数据不一致或其他异常。常见的线程安全问题包括:

  • 竞态条件(Race Condition):多个线程竞争同一资源导致结果不确定。
  • 内存可见性:一个线程修改了共享变量,其他线程可能无法立即看到最新值。
  • 指令重排序:编译器或处理器为优化性能而重新排序指令,可能影响多线程执行顺序。

保证线程安全的方法

  • 同步机制:使用synchronized关键字或ReentrantLock
  • 原子类:如AtomicIntegerAtomicLong等。
  • volatile关键字:保证变量的可见性。
  • 并发容器:如ConcurrentHashMapCopyOnWriteArrayList等。

线程的创建方式

Java提供了三种创建线程的方式:

1. 继承Thread类
public class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程执行中...");}public static void main(String[] args) {MyThread thread = new MyThread();thread.start();}
}
2. 实现Runnable接口
public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("线程执行中...");}public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();}
}
3. 实现Callable接口(带返回值)
import java.util.concurrent.*;public class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "执行结果";}public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor();Future<String> future = executor.submit(new MyCallable());System.out.println(future.get());executor.shutdown();}
}

线程池(ThreadPoolExecutor)

线程池是管理线程的最佳实践,避免频繁创建和销毁线程带来的性能开销。

核心参数
public ThreadPoolExecutor(int corePoolSize,                 // 核心线程数int maximumPoolSize,              // 最大线程数long keepAliveTime,               // 空闲线程存活时间TimeUnit unit,                    // 时间单位BlockingQueue<Runnable> workQueue, // 任务队列ThreadFactory threadFactory,      // 线程工厂RejectedExecutionHandler handler   // 拒绝策略
)
参数作用
  1. corePoolSize:线程池的基本大小,当提交的任务数小于此值时,直接创建新线程执行任务。
  2. maximumPoolSize:线程池允许的最大线程数,当任务队列满且线程数小于此值时,会创建新线程。
  3. keepAliveTime:当线程数大于核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。
  4. workQueue:用于保存等待执行的任务的阻塞队列,常见类型有:
    • ArrayBlockingQueue:有界队列
    • LinkedBlockingQueue:无界队列(需注意OOM风险)
    • SynchronousQueue:直接提交队列
  5. threadFactory:创建线程的工厂,可自定义线程名称、优先级等。
  6. handler:当任务队列和线程池都满时的拒绝策略,默认有四种:
    • AbortPolicy:直接抛出异常(默认)。
    • CallerRunsPolicy:由调用线程处理任务。
    • DiscardPolicy:丢弃最新的任务。
    • DiscardOldestPolicy:丢弃最老的任务。

线程池配置最佳实践

1. 手动配置线程池
import java.util.concurrent.*;public class ThreadPoolConfig {public static ExecutorService createThreadPool() {return new ThreadPoolExecutor(5,                               // 核心线程数10,                              // 最大线程数60,                              // 空闲线程存活时间TimeUnit.SECONDS,new LinkedBlockingQueue<>(100),  // 任务队列大小Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy()  // 拒绝策略);}
}
2. Spring Boot自动配置

在Spring Boot项目中,可通过配置文件设置线程池参数:

spring:task:execution:pool:core-size: 5max-size: 10queue-capacity: 100keep-alive: 60sthread-name-prefix: my-task-
3. Spring Cloud中的线程池配置

在微服务架构中,线程池配置需考虑服务间调用的特性:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
public class AsyncConfig {@Bean(name = "asyncExecutor")public ThreadPoolTaskExecutor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10);executor.setMaxPoolSize(50);executor.setQueueCapacity(200);executor.setKeepAliveSeconds(300);executor.setThreadNamePrefix("cloud-async-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}

使用@Async注解启用异步方法:
@Async 是 Spring 框架提供的注解,用于标记一个方法为异步方法。当调用该方法时,Spring 会将其提交到线程池执行,而不是由调用线程同步执行。这在处理耗时操作时非常有用,可以避免阻塞主线程

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class MyService {@Async("asyncExecutor")public CompletableFuture<String> processAsync() {// 异步处理逻辑return CompletableFuture.completedFuture("处理完成");}
}

分布式场景下的线程安全

在分布式系统中,仅靠JVM级别的同步机制无法保证线程安全,需引入分布式锁:

1. Redis分布式锁
import redis.clients.jedis.Jedis;public class RedisLock {private static final String LOCK_KEY = "distributed_lock";private static final String RELEASE_SCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then " +"   return redis.call('del', KEYS[1]) " +"else " +"   return 0 " +"end";private Jedis jedis;public RedisLock(Jedis jedis) {this.jedis = jedis;}public boolean acquireLock(String requestId, int expireTime) {String result = jedis.set(LOCK_KEY, requestId, "NX", "PX", expireTime);return "OK".equals(result);}public boolean releaseLock(String requestId) {Object result = jedis.eval(RELEASE_SCRIPT, 1, LOCK_KEY, requestId);return 1L.equals(result);}
}
2. ZooKeeper分布式锁

使用Apache Curator框架:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;public class ZookeeperLock {private static final String LOCK_PATH = "/distributed_lock";private InterProcessMutex lock;public ZookeeperLock(String zkConnectString) {CuratorFramework client = CuratorFrameworkFactory.newClient(zkConnectString, new ExponentialBackoffRetry(1000, 3));client.start();lock = new InterProcessMutex(client, LOCK_PATH);}public void acquire() throws Exception {lock.acquire();}public void release() throws Exception {lock.release();}
}

10种需要多线程的业务场景

1. 高并发Web服务器
  • 场景:处理大量HTTP请求,每个请求独立处理。
  • 实现:使用线程池处理请求,避免频繁创建线程。
  • 示例:Tomcat、Netty等服务器的线程模型。
2. 批处理任务
  • 场景:批量处理大量数据(如ETL作业)。
  • 实现:将数据分片,每个线程处理一部分数据。
  • 优势:显著提高处理速度。
3. 异步IO操作
  • 场景:文件读写、网络通信等IO密集型操作。
  • 实现:使用异步线程执行IO操作,主线程继续处理其他任务。
  • 示例:数据库查询、HTTP请求调用。
4. 定时任务调度
  • 场景:定期执行任务(如数据备份、统计报表生成)。
  • 实现:使用ScheduledExecutorService或Spring的@Scheduled注解。
  • 示例:每天凌晨执行数据同步任务。
5. 实时数据处理
  • 场景:实时分析数据流(如日志分析、监控数据处理)。
  • 实现:使用多线程并行处理数据流。
  • 示例:电商平台实时计算商品销量排行。
6. 图形界面应用
  • 场景:保持UI响应性的同时执行耗时操作。
  • 实现:将耗时操作放在后台线程执行。
  • 示例:文件下载进度显示、复杂计算。
7. 分布式缓存更新
  • 场景:缓存失效时,异步更新缓存数据。
  • 实现:使用后台线程重新加载数据到缓存。
  • 优势:避免用户请求等待缓存更新。
8. 消息队列消费者
  • 场景:从消息队列(如Kafka、RabbitMQ)消费消息。
  • 实现:多线程并行消费,提高吞吐量。
  • 示例:订单处理、日志收集。
9. 搜索引擎索引构建
  • 场景:构建大规模索引(如Elasticsearch索引)。
  • 实现:多线程并行处理文档,加速索引构建。
  • 优势:缩短索引构建时间,提高搜索服务可用性。
10. 游戏服务器
  • 场景:处理多个玩家的并发操作。
  • 实现:每个玩家会话由独立线程处理。
  • 示例:多人在线游戏的服务器端逻辑。

线程参数详解

1. 线程优先级(Priority)
  • 作用:控制线程的调度优先级,范围1-10(默认5)。
  • 注意:优先级高的线程更可能被CPU调度,但不保证绝对顺序。
2. 守护线程(Daemon Thread)
  • 作用:为其他线程提供服务(如垃圾回收线程)。
  • 特性:当所有非守护线程结束时,守护线程自动终止。
  • 设置thread.setDaemon(true)必须在start()前调用。
3. 线程状态(State)

Java线程有6种状态:

  • NEW:线程创建但未启动。
  • RUNNABLE:就绪或运行中。
  • BLOCKED:等待获取锁。
  • WAITING:等待其他线程唤醒(如wait())。
  • TIMED_WAITING:定时等待(如sleep(long))。
  • TERMINATED:线程执行完毕。
4. 中断(Interruption)
  • 作用:通知线程应该终止,但线程可选择忽略。
  • 方法
    • thread.interrupt():中断线程。
    • Thread.interrupted():检查并清除中断状态。
    • thread.isInterrupted():检查中断状态。

总结

Java多线程是提升应用性能和响应性的关键技术,但需谨慎处理线程安全问题。在分布式场景中,需结合分布式锁等机制确保跨节点的一致性。合理配置线程池参数和选择合适的业务场景应用多线程,能显著提升系统吞吐量和用户体验。
在异步执行的场景下保证事务有效性是一个常见的挑战,因为Spring的事务管理基于线程绑定的TransactionSynchronizationManager,而异步方法会在独立线程中执行,导致事务上下文丢失。以下是详细解决方案:

问题根源

Spring事务依赖于线程上下文传递事务信息。当使用@Async时,方法在新线程中执行,与调用线程不在同一个事务上下文:

  1. 事务管理器失效:新线程没有绑定事务上下文。
  2. 数据库连接丢失:每个线程使用独立的数据库连接。
  3. 异常回滚失效:异步线程的异常无法触发调用线程的事务回滚。

解决方案

1. 独立事务(推荐)

为每个异步方法创建独立的事务,适用于可容忍部分失败的场景(如批量处理)。

配置示例

@Service
public class AsyncService {@Async("asyncExecutor")@Transactional(propagation = Propagation.REQUIRES_NEW)  // 创建新事务public CompletableFuture<Void> processData(Long recordId) {// 数据库操作repository.updateStatus(recordId, "PROCESSING");try {// 业务逻辑complexProcessing(recordId);repository.updateStatus(recordId, "SUCCESS");return CompletableFuture.completedFuture(null);} catch (Exception e) {repository.updateStatus(recordId, "FAILED");throw new RuntimeException("处理失败", e);  // 触发当前事务回滚}}
}

特点

  • 每个异步任务独立提交/回滚。
  • 适合批量处理大量数据,部分失败不影响整体。
2. 事件驱动架构

将异步操作转为事件,主线程提交事务后再处理事件,确保数据一致性。

实现步骤

  1. 定义事件
public class DataProcessEvent {private final Long recordId;public DataProcessEvent(Long recordId) { this.recordId = recordId; }// getter
}
  1. 发布事件(在事务内)
@Service
public class MainService {@Autowiredprivate ApplicationEventPublisher eventPublisher;@Transactionalpublic void createAndProcessData() {// 创建记录(事务内)Long recordId = repository.save(new Record()).getId();// 发布事件(事务提交后触发)eventPublisher.publishEvent(new DataProcessEvent(recordId));}
}
  1. 异步监听事件
@Component
public class DataProcessListener {@Async@EventListenerpublic void handleDataProcessEvent(DataProcessEvent event) {// 异步处理(无事务)processData(event.getRecordId());}
}

特点

  • 事务提交后才触发异步处理。
  • 适合耗时操作不影响主线程事务的场景。
3. 手动管理事务(高级)

在异步方法中手动获取和管理事务,适用于强一致性要求的场景。

示例代码

@Service
public class ManualTransactionService {@Autowiredprivate PlatformTransactionManager transactionManager;@Autowiredprivate TransactionDefinition transactionDefinition;@Async("asyncExecutor")public CompletableFuture<Void> processWithManualTx(Long recordId) {TransactionStatus status = transactionManager.getTransaction(transactionDefinition);try {// 数据库操作repository.updateStatus(recordId, "PROCESSING");complexProcessing(recordId);// 手动提交事务transactionManager.commit(status);return CompletableFuture.completedFuture(null);} catch (Exception e) {// 手动回滚事务transactionManager.rollback(status);throw new RuntimeException("处理失败", e);}}
}

特点

  • 完全控制事务边界。
  • 代码复杂度高,需谨慎处理异常。
4. 补偿事务(最终一致性)

通过补偿机制保证最终一致性,适用于分布式系统。

实现方案

  1. 记录操作日志:在主事务中记录所有操作。
  2. 异步执行:调用外部服务或执行复杂逻辑。
  3. 补偿逻辑:若异步操作失败,根据日志执行反向操作。

示例代码

@Service
public class CompensationService {@Transactionalpublic void createOrderWithCompensation(Order order) {// 1. 创建订单(主事务)Order savedOrder = orderRepository.save(order);// 2. 记录补偿日志(主事务)compensationLogRepository.save(new CompensationLog(savedOrder.getId(), "CREATE_ORDER", savedOrder));// 3. 异步处理库存、支付等(无事务)asyncService.processOrderAsync(savedOrder.getId());}
}@Service
public class AsyncService {@Asyncpublic void processOrderAsync(Long orderId) {try {// 扣减库存、调用支付等操作inventoryService.debitStock(orderId);paymentService.processPayment(orderId);} catch (Exception e) {// 触发补偿逻辑compensationService.rollbackOrder(orderId);}}
}

特点

  • 保证最终一致性,而非强一致性。
  • 适合跨服务、跨系统的操作。

最佳实践总结

  1. 优先使用独立事务:为每个异步任务创建独立事务,通过状态跟踪失败记录。
  2. 避免长事务:将耗时操作移出事务,减少锁持有时间。
  3. 使用可靠消息队列:如RabbitMQ、Kafka,确保事件不丢失。
  4. 实现幂等性:异步操作需支持重试(如唯一索引、状态校验)。
  5. 监控与告警:记录异步任务状态,及时发现并处理失败。

常见误区

  1. 错误配置传播行为

    • 使用Propagation.REQUIRED(默认)会导致异步方法加入调用者的事务(但实际上无法加入)。
    • 必须使用Propagation.REQUIRES_NEW创建新事务。
  2. 忽略异步异常

    • 未捕获的异常会导致事务无法回滚。
    • 确保在异步方法中处理异常或使用CompletableFuture的异常处理。
  3. 过度依赖同步事务

    • 在分布式系统中,强一致性难以实现,考虑最终一致性方案。

通过合理选择事务管理策略,结合异步编程模型,可以在保证系统性能的同时,有效维护数据一致性。

http://www.whsansanxincailiao.cn/news/30286524.html

相关文章:

  • 海珠建网站多少钱/西安网站关键词推广
  • 网站广告/媒体发布公司
  • 易名域名交易/班级优化大师
  • 贵阳做网站cncolour/深圳seo优化排名
  • 做智能网站系统下载/抖音推广公司
  • wordpress优惠券采集/西安百度关键词优化
  • 企业网站制作机构排名/免费外链代发平台
  • 网站跟别的做的一样的/石家庄最新消息今天
  • 网站上内容列表怎么做/网站流量统计
  • 视频网站怎么做外链/网站统计代码
  • 如何做拉勾勾网站/做手机关键词快速排名软件
  • asp 网站管理系统/网店运营与推广
  • 网站建设公司 腾佳/为什么不能去外包公司
  • 苏州网站建设凡科/西安网站托管
  • 建筑证书兼职网站/关于普通话的手抄报
  • 郑州网站服务外包公司/免费收录链接网
  • 洛阳网络建站/百度热搜高考大数据
  • 佛山网站建设正规公司/西安排名seo公司
  • 好用的网站模板/全媒体运营师培训机构
  • wordpress缩略图没/免费seo网站自动推广
  • 网站建设情况简介/搜索引擎的优化方法有哪些
  • 东莞网站建设公司哪家好/成功的网络营销案例ppt
  • 关于网站建设的毕业论文案例/网站怎么做的
  • 网站济南网站建设/个人网站seo
  • 专门做酒店的网站/求好用的seo软件
  • 够完美网站建设/防疫测温健康码核验一体机
  • 网站租用服务器费用/阿里云搜索引擎
  • wordpress分页导航/宁波seo外包引流推广
  • wordpress theme开发/白城seo
  • 佛山市品牌网站建设公司/百度seo竞价推广是什么