一:线程池
线程池的作用就是限制系统中执行线程的数量。
根据系统环境的情况,可以自动或者手动设置线程的数量,达到运行的最佳效果。使用线程池可以减少线程的创建和销毁次数,每个工作线程都可以重复被利用,可以执行多个任务。每个线程大约需要1M的内存,可以根据系统的承受能力设置线程池的大小。Java里面线程池的真正接口是ExecutorService。
下面是一些常用的静态工厂,生成一些常用的线程池:
1.newSingleThreadExecutor
创建一个单线程的线程池,这个线程池只有一个线程在工作,此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
2.newFixedTheadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,知道线程达到线程池的最大大小。线程池的大小一旦达到最大值就保持不变,如果某一个线程因为执行异常结束,那么线程池会补充一个新线程。
3.newCachedThreadPool
创建一个可缓存的线程池,如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(1分钟不执行)的线程,当任务书增加是,此线程池又可以智能的添加新线程来处理任务,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统能够创建线程的大小。
4.newScheduledThreadPool
创建一个大小无限的线程池,此线程池支持定时以及周期性的执行任务的需求。
实例
MyThread 写道
package com.honzh.mwq.test;
import java.io.IOException;
public class MyThread implements Runnable {
private int i;
public MyThread(int i) {
this.i = i;
}
public void run() {
try {
FileOutUtil.out(Thread.currentThread().getName() + " " + this.i + " 正在执行...");
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
public class MyThread implements Runnable {
private int i;
public MyThread(int i) {
this.i = i;
}
public void run() {
try {
FileOutUtil.out(Thread.currentThread().getName() + " " + this.i + " 正在执行...");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(2); for (int i = 0 ; i < 100000000; i++) { pool.execute(new MyThread(i)); } pool.shutdown(); try { FileOutUtil.out("pool is shutdown"); } catch (IOException e) { e.printStackTrace(); } }
public static void main(String[] args) { ExecutorService pool = Executors.newCachedThreadPool(); for (int i = 0 ; i < 1000000000; i++) { pool.execute(new MyThread(i)); } pool.shutdown(); try { FileOutUtil.out("pool is shutdown"); } catch (IOException e) { e.printStackTrace(); } }
但是经过测试,以上代码依然没有摆脱内存会溢出的问题。
后面继续寻找好的解决方案。。。。
以上先介绍Java自带线程池的使用方法
相关推荐
首先,我们需要了解Java中的ExecutorService接口,它是线程池的核心接口。通过ExecutorService,我们可以提交Runnable或Callable任务,并控制线程的执行。Java提供了一些内置的ExecutorService实现,如...
Java提供了多种机制来实现这一点: 1. **Wait/Notify**: `Object.wait()`和`Object.notify()`用于线程之间的简单同步。 2. **CountDownLatch**: 允许一个或多个线程等待其他线程完成一组操作。 3. **CyclicBarrier*...
6. **多线程**:Java内置了对多线程的支持,理解线程同步、线程池和并发编程模型如ExecutorService是高级Java编程的一部分。 7. **反射机制**:Java的反射API允许在运行时检查类、接口、字段和方法的信息,这对于...
"一点课堂 JAVA核心知识点整理.zip"这个压缩包文件包含了关于Java编程的关键概念和技能的详细总结,非常适合初学者和有经验的开发者进行学习和复习。 首先,Java的核心知识点包括基础语法。这包括变量声明、数据...
- OOP是Java的核心,理解类的定义、对象的创建和销毁、属性与方法的封装、单一职责原则等是基础。 2. **Java语法基础**: - exam.doc:可能包含Java的基础语法测试,如变量声明、数据类型、运算符、流程控制(if...
2. **线程池支持**:可能扩展了`java.util.concurrent.ExecutorService`接口,使得线程池中的线程也可以根据策略绑定到特定的核心。 3. **平台兼容性**:考虑到跨平台兼容性,该项目可能实现了对Linux、Windows、...
操作系统是计算机系统的核心组成部分,它负责管理系统的硬件资源和软件资源,为应用程序...理解这一点对于开发高效、并发的Java应用程序至关重要。开发者可以根据需求选择合适的调度策略,以优化系统的性能和响应性。
这份笔记的目的是帮助初学者系统地理解并掌握Java这门强大的编程语言。下面将详细阐述一些关键知识点,旨在为你的学习之路提供清晰的指导。 1. **Java基础**: - **变量与数据类型**:了解基本数据类型(如int、...
理解和掌握并发控制(如synchronized关键字、wait()和notify()方法)、线程同步(如Semaphore、CyclicBarrier)以及线程池(ExecutorService)的使用,对于开发高并发应用至关重要。 4. **集合框架**:Java集合框架...
3. **线程池与ExecutorService**:Java的Executor框架简化了线程管理,通过ThreadPoolExecutor可以创建线程池,这有助于控制系统的资源消耗和提高效率。ScheduledExecutorService则支持定时和周期性任务的执行。 4....
这份"关于个人的java笔记整理"涵盖了Java的基础知识、核心概念以及可能包含的试题,旨在帮助学习者巩固理解,为日后的开发工作提供参考。 笔记整理首先可能会涉及Java的基础语法,包括但不限于变量、数据类型、...
此外,Java内存模型(JMM)也是并发编程中的核心概念,它规定了线程如何共享内存,理解这一点对于理解和调试并发代码至关重要。 接下来,我们转向《深入了解JVM虚拟机》。Java虚拟机(JVM)是Java程序运行的基础,...
同时,考虑到工业数据的安全性,通信过程可能需要加密和身份验证,Java的SSL/TLS支持可以帮助实现这一点。 6. **性能优化**:在处理大量数据传输时,优化网络通信性能是必要的。这可能包括缓冲区管理、最小化数据...
Java的Exception类和log4j等库可以帮助实现这一点。 通过对这个QQ聊天软件Java源码的学习,我们可以深入了解网络编程、数据库操作、多线程、用户界面设计以及安全性等多个方面的知识,这对于提升Java编程技能和理解...
8. **多线程**:Java提供了丰富的多线程支持,试题可能会考察Thread类的使用、实现Runnable接口、线程同步(synchronized关键字、wait()、notify()、notifyAll())以及线程池(ExecutorService)的使用。 9. **枚举...
Exchanger是用于在两个线程之间交换对象的一个同步点,在这一点上,一个线程可以把一些数据传递给另一个线程,交换数据通常发生在配合线程池的使用,进行生产者-消费者模式处理数据。 CyclicBarrier是一个同步辅助...
Java的Thread类和Runnable接口可以帮助我们实现这一点。我们可以创建一个线程池或者为每个新连接创建一个新的线程,这样每个线程都可以独立处理与特定客户端的通信,避免了单线程模型下的阻塞问题。同时,客户端也...
Java的多线程机制可以实现这一点,`ExecutorService`和`ThreadPoolExecutor`可以帮助我们管理和控制线程池,以防止过度并发导致的服务器压力过大。 4. **数据存储**:爬取的数据需要存储,可以选择数据库(如MySQL...
Java.util.logging API 或者第三方库如Log4j可以帮助我们实现这一点。 **9. 单元测试与集成测试** 确保代码质量的一个重要步骤是进行单元测试和集成测试。JUnit 是Java中广泛使用的单元测试框架,而Mockito可以用来...
- 用户的绘图操作需要转化为可传输的格式,Java的序列化接口(Serializable)可以帮助我们实现这一点。将图形对象序列化为字节数组,然后在网络上传输;接收端再进行反序列化恢复图形。 7. **异常处理**: - 网络...