初次学习多线程——自己写的一个线程池

 1 package com.lovo.threadpool;
 2
 3 public class ThreadOfPool extends Thread{
 4     private Runnable task = null;
 5     private ThreadPool threadPool;
 6     private boolean stop = false;//线程状态
 7     public ThreadOfPool() {
 8     }
 9     public ThreadOfPool(ThreadPool threadPool) {
10         this.threadPool = threadPool;
11     }
12     /**
13      * 给线程分配指定的任务
14      * @param task
15      */
16     public synchronized void setTask(Runnable task) {
17         this.task = task;
18         notify();
19     }
20     /**
21      * 线程执行
22      */
23     private synchronized void executeTask() {
24         while (!stop) {
25             while (!stop && task == null) {
26                 try {
27                     wait();
28                 } catch (InterruptedException e) {
29                     stop = true;
30                 }
31             }
32             if (task != null) {
33                 task.run();
34                 task = null;
35                 threadPool.free(this);
36             }
37         }
38     }
39     @Override
40     public void run() {
41         executeTask();
42     }
43     public Runnable getTask() {
44         return task;
45     }
46     public void setStop(boolean stop) {
47         this.stop = stop;
48     }
49
50 }
 1 package com.lovo.threadpool;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 public class ThreadPool {
 7     private List<Thread> freeThreads = new ArrayList<Thread>();//空闲线程(可用)
 8     private List<Thread> usingThreads = new ArrayList<Thread>();//正在被使用的线程(不可用)
 9     private int POOL_SIZE = 5;
10     public ThreadPool(){
11         this(POOL_SIZE);
12     }
13     public ThreadPool(int num){
14         POOL_SIZE = num;
15         for (int i = 0; i < POOL_SIZE; i++) {
16             ThreadOfPool tempThread = new ThreadOfPool(this);
17             tempThread.start();
18             freeThreads.add(tempThread);
19         }
20     }
21     /**
22      * 分配一个线程
23      * @param t
24      */
25     public synchronized void execute(Runnable t) {
26         while (freeThreads.isEmpty()) {
27 //            System.out.println("线程池繁忙,请等待!");
28             try {
29                 wait();
30             } catch (InterruptedException e) {
31                 e.printStackTrace();
32             }
33         }
34         ThreadOfPool tempthread= (ThreadOfPool) freeThreads.remove(freeThreads.size() - 1);
35         usingThreads.add(tempthread);
36         tempthread.setTask(t);
37     }
38     /**
39      * 分配的线程用完后的回收处理
40      * @param threadOfPool
41      */
42     public synchronized void free(ThreadOfPool threadOfPool) {
43         usingThreads.remove(threadOfPool);
44         freeThreads.add(threadOfPool);
45         notify();
46     }
47     /**
48      * 关闭线程池
49      */
50     public void close() {
51         while (freeThreads.size() < POOL_SIZE) {}
52         for (Thread thread : freeThreads) {
53             thread.interrupt();
54         }
55     }
56 }
时间: 2024-08-03 17:54:18

初次学习多线程——自己写的一个线程池的相关文章

死磕 java线程系列之自己动手写一个线程池(续)

(手机横屏看源码更方便) 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢? 简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的任务的,那么,我们自己能否实现呢?必须可以,今天我们就一起来实现带返回值任务的线程池. 前情回顾 首先,让我们先回顾一下上一章写的线程池: (1)它包含四个要素:核心线程数.最大线程数.任务队列.拒绝策略: (2)它具有执行无返回值任务的能力: (3)它无法处理有返回值的任务: (4)它无法处理任务

JAVA面试经典合集2:怎样写出一个线程安全的单例模式

怎样写出一个线程安全的单例模式 package com.chendan.mianshi; /** * * * @Description * @author ChenDan [email protected] * @date 2019年8月4日下午8:47:13 * */ public class MianShiTest2 { public static void main(String[] args) { // [email protected] // [email protected] //

死磕 java线程系列之自己动手写一个线程池

欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写的线程池如何测试? 简介 线程池是Java并发编程中经常使用到的技术,那么自己如何动手写一个线程池呢?本文彤哥将手把手带你写一个可用的线程池. 属性分析 线程池,顾名思义它首先是一个"池",这个池里面放的是线程,线程是用来执行任务的. 首先,线程池中的线程应该是有类别的,有的是核心线程,有

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917 我们来继续学习多线程 Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock Lock void lock():获取锁 v

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

java多线程系类:JUC线程池:01之线程池架构

概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构图线程池示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html 线程池架构图 线程池的架构图如下: 1. Executor 它是"执行者"接口,它是来执行任务的.准确的说,Executor提供了execute()接口来执行

java多线程系类:JUC线程池:03之线程池原理(二)(转)

概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代码(基于JDK1.7.0_40)线程池源码分析(一) 创建"线程池"(二) 添加任务到"线程池"(三) 关闭"线程池" 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509954.h

理解线程池,自己实现一个线程池

线程池本质是一个生产者-消费者模式,一边维护一些线程执行任务,一边由主线程添加一些任务.现在我们抛弃源码中一些繁杂的状态判断,自己写一个线程池. public class poolT { //可能频繁增删任务,链表队列效率较高 private final BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(); private final HashSet<Work> workers