开发中遇到的问题:看到项目先前实现的代码,有一个逻辑处理,要完成两个界面的切换,而且这个两个界面的切换会共同设置系统的同一个资源的状态,且设置状态的操作(系统中间件已经做了互斥)比较耗时。先前的代码采用了新建线程来设置资源状态来保证主线程不被阻塞。这就出现了一个问题,如果频繁操作切换的话,就会出现系统资源的状态错乱。
应用调用:
Thread call state(true);
Thread call state(false);
Thread call state(true);
Thread call state(false);
Thread call state(true);
...
Thread call state(true);
实际执行结果:
Thread run state(true);
Thread run state(false);
Thread run state(true);
Thread run state(true);
Thread run state(false);
...
Thread run state(false); or Thread run state(true);
执行结果可以看出,在频繁调用的时候就出现与调用顺序不对应的问题,调用结束的结果可能会是错误的。
究其原因是因为只考虑了耗时操作采用线程来处理,没有对线程进行管理,造成一个操作结束后,其他等待的线程抢占运行,结果肯定会出现不对应调用的情况。
解决方法:
对于状态这种设置的处理,优先要保证状态的正确性,如果在执行true的时候,又调用设置false,再调用设置true。最终结果会是true。那么在执行第一次true的时候,来了两个操作,可以选择丢弃中间设置false的操作,来提高响应效率和保证结果正确。
另外线程的组织管理,没有比线程池好的。
频繁调用帮助类:
/** * 如果你遇到这种场景:应用需要频繁的调用两个互斥的耗时操作,而且要保证效率与结果正确的话,这个帮助类对于你可能会有用。 * Created by leonhover on 13-12-11. */ public class FrequencyTaskHelper { /** * 线程池 */ private ThreadPoolExecutor threadPool = null; /** * 任务队列,大小为1 */ private ArrayBlockingQueue queue = new ArrayBlockingQueue<Runnable>(1); public FrequencyTaskHelper() { //创建线程池,只有一个线程在运行,采用DiscardOldestPolicy机制(采用其他也可以,因为用不到,我们手动清空任务队列) threadPool = new ThreadPoolExecutor(1, 1, 50, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.DiscardOldestPolicy()); } /** * 在线程池中执行操作,不一定被执行 * * @param runnable 操作任务 */ public void execute(Runnable runnable) { //清空任务队列 queue.clear(); //在线程池中执行,如果没有任务运行则执行,要不就排队,排队后又可能被丢弃。 threadPool.execute(runnable); } }
测试类
/** * 测试任务,任务延迟有20毫秒 */ public static class TestOption implements Runnable { private String name = null; public TestOption(String str) { name = str; } @Override public void run() { System.out.println("Task " + name + " start "); System.out.println("Task " + name + " executed!"); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Task " + name + " end "); } } //程序入口 public static final void main(String[] args) { System.out.println("Start"); FrequencyTaskHelper helper = new FrequencyTaskHelper(); for (int i = 0; i < 100000; i++) { TestOption opt = new TestOption("opt" + i); helper.execute(opt); } }
相关推荐
【操作系统中的进程间同步互斥】 在操作系统中,进程间的同步和互斥是多线程编程中的核心概念。在银行柜员服务问题中,这些概念得到了实际的应用。该问题模拟了一个银行环境,其中n个柜员为顾客提供服务。为了解决这...
在“操作系统实验 多线程同步与互斥 java编写 有界面”的实验中,可能需要设计一个图形用户界面(GUI),通过按钮或事件触发线程的创建和同步操作,直观地展示线程间的交互和同步效果。例如,可以模拟银行账户转账,...
下面是一个简单的Java PV操作示例,模拟了两个线程对一个共享资源(如打印机)的互斥访问: ```java import java.util.concurrent.Semaphore; public class PrintService { private Semaphore printerSemaphore =...
在“广州软件园实习报告——java实习”这个项目中,我们可以深入探讨实习生在软件开发领域,特别是Java编程方面的学习和实践经验。这篇实习报告是作者在广东广州软件园实习期间的成果展示,它揭示了实习生在专业技能...
操作形同实验——进程同步和互斥 (1) 通过编写程序实现进程同步和互斥,掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。 (2...
5. **IO流**: Java的IO流用于读写数据,包括文件操作、网络通信等。NIO(New IO)提供了一种更有效的方式进行数据传输。 6. **多线程**: Java提供了对并发编程的良好支持,包括Thread类和Runnable接口。理解线程...
- `Log4j或Java.util.logging`:为了调试和监控程序运行状态,通常会使用日志记录工具,记录关键操作和错误信息。 9. **文件存储**: - `持久化存储`:聊天记录可能会被保存在本地文件系统中,以便于用户离线查看...
在操作系统中,临界区互斥是一个非常重要的概念,它是指在多线程环境中,多个线程访问共享资源的过程中,避免出现数据不一致和访问冲突的机制。通过使用临界区对象,可以实现线程同步,避免多个线程同时访问共享资源...
本例将模仿经典的线程同步互斥例子——生产者和消费者问题,来演示 java 强大的多线程机制。生产者和消费者共享一个数据,当数据为0 时,消费者不可访问,生产者可访问数据,每次访问数据加1;当数据到达100 时,...
7. **多线程**:JAVA提供了丰富的多线程支持,学习笔记会讲解线程的创建、同步、互斥以及线程池的使用。 8. **反射机制**:JAVA反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件开发、动态代理等...
这个模拟操作系统的进程同步与互斥问题是根据生产者-消费者问题来实现的。该问题是一个经典的进程同步问题,由 Dijkstra 提出,用以演示他提出的信号量机制。生产者线程生产物品,然后将物品放置在一个空缓冲区中供...
void ProducConsum(char *file); void Thread_Producter(void *p); void Thread_Consumer(void *p); CRITICAL_SECTION sem_mutex; HANDLE sem_full; HANDLE sem_avail;
在Java编程中,线程同步和互斥是多线程编程中的重要概念,它们用于解决多个线程同时访问共享资源时可能出现的问题。本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费...
《JAVA入门到精通——30天学通JAVA》是一本专为初学者设计的Java编程教程,旨在帮助读者在短短的30天内快速掌握Java编程基础,从而踏入编程世界的大门。Java作为一种广泛应用于互联网、移动应用、企业级开发等领域的...
1. **创建互斥体**:使用易语言的系统调用或者特定的API函数(如`CreateMutex`)来创建一个互斥体对象。创建时可以指定一个名字,使得不同进程中的线程可以通过这个名字找到并使用同一个互斥体。 2. **打开互斥体**...
- **线程安全**:如果多个Java线程同时调用native方法,需要确保C++代码是线程安全的,可能需要使用互斥锁等同步机制。 - **内存管理**:跨语言调用时,需要注意内存的分配和释放,避免内存泄漏。 - **平台兼容性**...
操作系统进程同步和互斥是操作系统中至关重要的概念,它们确保了多进程或多线程环境下的资源有效管理和安全访问。本实验报告详细介绍了如何通过编程实现这一机制,并以生产者-消费者问题为实例进行演示。 实验的...
操作系统中的进程管理是其核心功能之一,特别是在处理进程的互斥、同步以及通信时。本课件主要探讨了这三个关键概念,以及并发进程的相关性质。 首先,进程互斥是指在多道程序环境下,某些资源一次只能由一个进程...
操作系统实验报告——进程同步与互斥 本实验报告的主要目的是掌握基本的进程同步与互斥算法,理解生产者-消费者问题,并学习使用 Windows 2000/XP 中基本的同步对象,掌握相关 API 的使用方法。 一、进程同步与...
操作系统实验报告——进程同步与互斥 该实验报告的目的旨在掌握基本的进程同步与互斥算法,理解生产者-消费者问题,并学习使用 Windows 2000/XP 中基本的同步对象,掌握相关API 的使用方法。实验环境采用 Windows ...