package proxy;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
//测试main入口
public class CocurrentThread {
public static void main(String[] args){
//创建一个线程池,可以运行5条线程
PoolThread pt = new PoolThread(5);
//开启线程池工作开关
pt.start();
//往线程池中加入10个任务
for(int i = 0;i < 10;i++){
pt.execute(new ConcreteTask());
}
//关闭线程池开关
pt.shutdown();
}
}
/**
*要交给线程池处理的具体任务,用户可以自定义,不一定要实现Runnable接口,这里实现
*Runnable只是利用Runnable接口生成一种规范。
**/
class ConcreteTask implements Runnable{
private static int i;
//具体实现的任务在这里编写
public void run() {
System.out.println(Thread.currentThread().toString() + i++);
}
}
/**
*线程池核心类
**/
class PoolThread{
//实现线程池对象时最大的可用线程数
private int maxThreads;
//线程池工作的启动开关
private boolean on = false;
//这里定义了一个任务队列容器,用途很明显,就是用来放置要处理的任务,先进来的先交给线程池处理
private Queue<Runnable> tasks = new ConcurrentLinkedQueue<Runnable>();//任务队列
//定义了一个放置Thread对象的容器,用来放置所有的线程
private List<Thread> poolThreads ;
//构造器,初始化时根据传入的参数来分配几条线程处理任务
public PoolThread(int maxThreads){
this.maxThreads = maxThreads;
poolThreads = new ArrayList<Thread>();
for(int i = 0;i < this.maxThreads;i++){
poolThreads.add(new Thread(new SingleThread()));
}
}
/**
*启动线程池,其实就是启动里面的每一条线程
*/
public void start(){
this.on = true;
for(int i = 0 ;i < poolThreads.size();i++){
//启动每个线程
poolThreads.get(i).start();
System.out.println("the number " + i + " thread of " + poolThreads.size());
}
}
/**
*关闭线程池的工作
*/
public void shutdown(){
this.on = false;
}
/**
*
* @param task 被执行的新任务,实现Runnable接口
*/
public void execute(Runnable task){
synchronized(tasks){
tasks.add(task);//将任务添加到线程池中执行
tasks.notifyAll(); //通知所有的锁定tasks线程,让其执行新加进来的任务
}
}
/**
*定义线程池中的线程类,该线程必需是永远不终止的。
*/
class SingleThread implements Runnable{
public void run() {
while(on){
synchronized(tasks){
Runnable task = tasks.poll(); //取出任务队列中的任务执行
if(task != null)
task.run();
if(tasks.size() == 0){ //如果队列中没有等待的任务,则停止线程,直到有任务加进队列时唤醒该线程
try {
tasks.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
}
分享到:
相关推荐
Java 实现通用线程池是指使用 Java 语言编写一个通用的线程池,线程池通俗的描述就是预先创建若干空闲线程,等到需要用多线程去处理事务的时候去唤醒某些空闲线程执行处理任务,这样就省去了频繁创建线程的时间,...
标题中的“Java实现的线程池、消息队列功能”是指在Java编程中,如何利用编程技术实现线程池和消息队列这两种重要的并发处理机制。线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、...
Java开发,Android开发,自己实现线程池,明白线程池的实现机制
Java线程池是一种高效管理线程的技术,它可以帮助开发者更好地控制并发执行的线程数量,避免资源浪费,提高系统性能。在Java中,线程池是通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类来实现的...
除了`ThreadPoolExecutor`,Java还提供了`Executors`工具类,它提供了一些预设的线程池配置,如`newFixedThreadPool`(固定大小线程池)、`newSingleThreadExecutor`(单线程线程池)等,方便开发者快速创建线程池。...
在代码中,我们创建了一个线程池,然后执行一个打印任务,打印出当前java进程的总线程数。结果显示,在创建到15万个线程时,内存占用百分百后java应用崩溃。说明线程未被回收。 因此,使用完线程池后一定要关闭,...
Java 程序中频繁地创建和销毁线程,会带来很大的性能开销。线程的创建需要系统资源,如内存、上下文切换等,销毁线程也会涉及到资源回收,这些都会消耗处理器时间和内存。此外,过多的线程可能会导致操作系统过度...
标题 "Java 线程池完整代码" 表明了这篇文章的主题是关于 Java 线程池的完整实现代码,涵盖了线程池的基本概念、配置文件的解析、线程池的创建和管理等方面。 描述解析 描述 "Java 线程池完整源码" 说明了这篇文章...
在Android和Java应用开发中,线程池是一种重要的并发编程工具,它可以帮助我们高效地管理后台任务,提高系统的响应速度和资源利用率。本Demo主要展示了如何在Java或Android环境中使用线程池,以下是对相关知识点的...
Java中Executors类中几种创建各类型线程池方法及简单实例
Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...
【自定义Java线程池实现】 在Java编程中,线程池是一种高效管理线程资源的方式,可以提高系统的性能和响应速度。本篇将探讨如何模拟Java的JDK线程池执行流程,以理解其设计原理。核心知识点包括线程池的执行策略、...
知识点:可以使用ForkJoinPool的构造方法并设定并行级别来创建一个自定义的线程池。 4. 总结 我们简要地看了一下,如何使用一个自定义的Thread Pool运行并行流。只要在正确的环境中配置了合适的平行级别,就能在...
为了避免这种情况,可以在创建线程池时指定一个合适的拒绝策略,比如使用`AbortPolicy`来终止程序,或者使用`CallerRunsPolicy`让调用者直接执行任务。 另一种线程泄漏的情形发生在工作线程执行长时间阻塞的任务时...
Java线程池是一种高效管理线程的机制,它克服了直接使用`new Thread()`创建线程的诸多弊端。创建线程池的主要目的是重用已存在的线程,减少新对象的创建和销毁开销,从而提升程序性能。此外,线程池还可以通过控制...
Java线程池是Java并发编程中的重要组成部分,它在多线程编程中扮演着至关重要的角色,有效地管理和调度了大量的并发任务。线程池通过预先创建并维护一组可重用线程,来提升程序的性能和效率,避免了频繁地创建和销毁...
2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...
Java线程、线程池和XML解析是Java编程中至关重要的三个概念,它们在实际开发中扮演着不可或缺的角色。下面将分别对这三个主题进行深入的介绍。 首先,我们来看Java线程。线程是程序执行的最小单位,一个进程可以...