既然Thread质疑声一片,为什么它仍能够存在呢?原因有:
(1)某些应用程序天生就具有并发特性,而且需要共享地址空间和各种资源,比如数据库服务器。
(2)进程方案开销大。
(3)Java语言大行其道,使得绝大部分程序员认为并发编程唯一也是最好的方式就是采用多线程,而且在Java语言中创建一个线程非常简单。
对于第二点,只有线程创建,线程同步,线程加锁等开销比进程方案开销小,才会真正获益。只是来个线程创建和进程创建开销的比较,那也太天真了。此处,我认为还要包括开发,维护进程并发程序和线程并发程序两种方式之间的开销对比。毕竟,除了机器时间,人的时间也很宝贵。
对于第三点,Java是不是会在以后考虑另外的并发模式。象建立在JVM之上的Scala语言就在采用Actor模式。多个选择,总是不错的主意。不然搞得我们这些开发人员都去用Thread,使得Thread被过度使用,破坏Thread的名声。
附:如果想了解Thread在哪些方面被广泛批评,请参考如下资料:
(1)《The Art of Unix Programming》的“Threads-Threat or Menace?”
(2)“Why Threads Are a Bad Idea”
(3)“The Problem with Threads”
分享到:
相关推荐
threadsample中可能包含对这些同步原语的使用示例。 2. 通信:线程间通信通常涉及线程间的等待和唤醒,如使用wait()、notify()和notifyAll()方法,或者使用BlockingQueue等高级并发工具。threadsample可能会展示...
解决这个问题的关键是在适当的地方插入`Thread.Sleep(20)`,短暂地让出CPU时间片,这样可以降低线程的优先级,允许其他线程运行,从而避免CPU过度消耗。 以下是一个示例代码,展示了如何创建一个子线程类...
- **用户界面更新**:在GUI应用程序中,为了确保界面的流畅性和响应性,可以适时地调用`Thread.Sleep(0)`来避免主线程过度占用CPU资源,从而使界面更新更加平滑。 - **线程调度优化**:在复杂的多线程环境中,通过...
- **过度优化风险**:不恰当的使用可能会导致性能下降,因为手动管理线程和核心绑定可能会引入不必要的复杂性和潜在的错误。 - **硬件限制**:不是所有硬件都支持线程亲和性,特别是某些低端或旧款设备可能不提供...
对于使用线程池的应用,TDA可以分析线程池的工作模式,如线程池的大小、当前活动线程数量、线程队列的长度等,帮助优化线程池配置,避免过度创建线程导致的资源浪费。 **使用TDA的步骤** 1. **生成线程转储**:在...
然而,过度依赖优先级可能导致优先级反转和饥饿现象,因此需要谨慎使用。 6. **线程池**:线程池是一种优化线程管理的技术,它可以重用已存在的线程,而不是每次需要时都创建新的线程。Delphi 自 2009 版本起,提供...
10. **性能优化**:合理使用多线程可以提升程序性能,但也需要注意过度使用可能导致的上下文切换开销和资源竞争。在设计多线程程序时,应考虑任务的粒度、负载均衡以及资源的有效利用。 通过深入学习和实践C++_...
过度使用`synchronized`方法可能导致不必要的阻塞,降低性能。优先考虑使用`synchronized`块,只锁定必要的代码部分。如果必须使用方法级别同步,考虑使用`Lock`接口提供的更细粒度的控制,如`ReentrantLock`。 4. ...
本资源"thread-VC.rar_vc thread"提供了一个使用VC编写并已测试通过的多线程示例,对于学习和理解如何在C++中运用多线程非常有帮助。 1. **线程基础**:线程是操作系统分配处理器时间的基本单位,一个进程可以包含...
- **检查线程状态**:可以使用`Thread.getState()`方法检查线程当前的状态。 - **线程等待与通知**:通过`wait()`和`notify()`方法实现线程间的同步和通信。 - **线程优先级调整**:通过`setPriority()`方法改变线程...
过度使用`wait/notify`可能导致线程调度开销增大,需谨慎设计。 4. **问题排查与优化** - 对于网络瓶颈,通过`netstat`监控网络流量,分析CPU使用情况,确认网络带宽是否限制了线程执行。 - 使用`jstack`配合`...
虽然Android系统允许设置线程优先级,但过度依赖它可能导致调度问题和其他性能问题。通常情况下,保持默认优先级并优化代码以减少阻塞是更好的选择。 理解并熟练运用这些知识点,开发者就能在Android平台上有效地...
4. 并发控制:线程池可以控制同时运行的任务数量,防止过多线程导致系统资源过度消耗。 5. 任务完成:任务执行完毕后,线程返回线程池等待下一个任务,而不是被销毁。 在实际应用中,Boost线程池可能包含以下关键...
`Thread.Sleep()`方法的基本语法是 `Thread.Sleep(int millisecondsTimeout)`,它会使得当前线程停止执行并进入非运行状态,直到指定的毫秒数过去或者被其他事件唤醒。这个方法常用于模拟延迟、避免过度繁忙的循环...
- 虽然TLS解决了数据隔离的问题,但过度使用TLS可能会增加内存开销和上下文切换时间。因此,合理设计线程间通信和数据共享是必要的。 8. **总结** - TLS是多线程编程中管理线程私有数据的有效手段,通过`pthread`...
线程转储是Java虚拟机(JVM)在特定时间点对所有运行线程状态的快照,通常用于诊断多线程问题,如死锁、线程阻塞或过度的线程活动。TDA提供的功能帮助开发者更有效地理解和解决这些复杂问题。 在"tda-bin-2.2.zip...
8. **性能考虑**:多线程可以提高程序性能,但过度使用或不当使用可能导致更高的上下文切换开销、竞争条件和死锁等问题。正确设计和优化多线程程序至关重要。 以上是关于`std::thread`的基本概念和用法,但深入理解...
此外,线程池的使用可以有效控制并发数量,防止系统资源过度消耗。 接下来,我们转向垃圾收集。Java的自动内存管理,即垃圾收集机制,使得程序员无需手动管理内存,但这也带来了性能优化的挑战。JVM有多种垃圾收集...
然而,过度使用`synchronized`可能导致线程阻塞,降低系统性能。为了解决这一问题,Java提供了更细粒度的锁,如`java.util.concurrent.locks.ReentrantLock`,它具有与`synchronized`相似的功能,但提供了更多的灵活...
3. **线程优先级**:Windows系统允许设置线程优先级,但过度依赖优先级可能导致优先级反转或优先级继承问题,应谨慎使用。 4. **线程安全**:确保函数或方法在多线程环境中调用时不会导致数据不一致,这通常通过锁...