- 浏览: 265210 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (298)
- 工作感悟 (6)
- java基础 (23)
- 计算机硬件知识 (1)
- 计算机网络知识 (2)
- Struts (3)
- Srping (4)
- hibernate (0)
- ibatis (0)
- webservice (4)
- Thread (22)
- maven (5)
- ubuntu/linux/centos/redhat (46)
- SSO (1)
- ESB (0)
- 工作流 (0)
- oracle (15)
- 云计算 (1)
- hadoop (1)
- nosql (0)
- mysql (3)
- sqlserver (0)
- jquery (0)
- 分布式 (3)
- 集群 (0)
- 设计模式 (2)
- EJB (0)
- map (0)
- cache (5)
- Niginx+varnish+squid+Ats (14)
- Apache (0)
- 工作/职业规划 (0)
- Scala & Groovy (1)
- English (4)
- 数据结构/算法 (6)
- 开发工具 (5)
- 测试 (2)
- Exception (0)
- 定时器 (3)
- j2ee (2)
- 部署 (1)
- Openssl (1)
- 操作系统 (3)
- kvm (13)
- libvirt (5)
- PostgreSql (5)
- 虚拟化 (3)
- 概念理解 (1)
- virt-manager (1)
- RESTful (3)
- 其它 (4)
- ssh2 (14)
- windows (1)
- 房产 (2)
- svn (1)
- 手机 (1)
- ant (1)
- flume (2)
- sqoop (1)
- fastdfs (5)
- log4j (1)
- SPDY (1)
- mongodb (2)
- MQ (2)
- Mina (1)
- dubbo (4)
- PMP (1)
- Webshpere (2)
- jvm (1)
- Btrace (1)
- zookeeper (7)
- UML (1)
- spring cloud (6)
- spring boot (5)
- storm (0)
- 软件管理 (1)
- elasticsearch (1)
- 协议 (2)
- docker (1)
- 性能 (2)
- 安全 (1)
- 代码规范 (1)
- mqtt (1)
- lombok (1)
- 车联网 (1)
- kafka (1)
最新评论
JDK线程池:Executors.newFixedThreadPool , Executors.newSingleThreadExecutor,由一个ThreadFactory来创建新的线程,默认情况下为Executors.defaultThreadFactory(),ThreadFactory接口:
public interface ThreadFactory {
Thread newThread(Runnable r);
}
我们可以采用自定义的ThreadFactory工厂,增加对线程创建与销毁等更多的控制,
一个简单的例子,跟踪线程的创建与销毁:
package org.guojje.threadpool;
import java.util.concurrent.atomic.AtomicInteger;
public class WorkThread extends Thread {
private Runnable target;
private AtomicInteger counter;
public WorkThread(Runnable target, AtomicInteger counter) {
this.target = target;
this.counter = counter;
}
@Override
public void run() {
try {
target.run();
} finally {
int c = counter.getAndDecrement();
System.out.println("terminate no " + c + " Threads");
}
}
}
package org.guojje.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class MyThread implements Runnable {
public static void main(String[] args) {
ExecutorService ctp = Executors.newCachedThreadPool(new ThreadFactory() {
private AtomicInteger count = new AtomicInteger();
public Thread newThread(Runnable r) {
int c = count.incrementAndGet();
System.out.println("create no " + c + " Threads");
return new WorkThread(r,count);
}
});
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.shutdown();
try {
ctp.awaitTermination(1200, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void run(){
System.out.println("complete a task!!!");
}
}
可以看到在执行这个过程中,共创建过几个线程。
public interface ThreadFactory {
Thread newThread(Runnable r);
}
我们可以采用自定义的ThreadFactory工厂,增加对线程创建与销毁等更多的控制,
一个简单的例子,跟踪线程的创建与销毁:
package org.guojje.threadpool;
import java.util.concurrent.atomic.AtomicInteger;
public class WorkThread extends Thread {
private Runnable target;
private AtomicInteger counter;
public WorkThread(Runnable target, AtomicInteger counter) {
this.target = target;
this.counter = counter;
}
@Override
public void run() {
try {
target.run();
} finally {
int c = counter.getAndDecrement();
System.out.println("terminate no " + c + " Threads");
}
}
}
package org.guojje.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class MyThread implements Runnable {
public static void main(String[] args) {
ExecutorService ctp = Executors.newCachedThreadPool(new ThreadFactory() {
private AtomicInteger count = new AtomicInteger();
public Thread newThread(Runnable r) {
int c = count.incrementAndGet();
System.out.println("create no " + c + " Threads");
return new WorkThread(r,count);
}
});
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.execute(new MyThread());
ctp.shutdown();
try {
ctp.awaitTermination(1200, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void run(){
System.out.println("complete a task!!!");
}
}
可以看到在执行这个过程中,共创建过几个线程。
发表评论
-
SequenceInputStream 合并流与切割流
2017-09-27 15:06 431将多个流合并成一个流 SequenceInputStrea ... -
java io 之管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
2017-09-27 10:39 299java 管道介绍 在java中, ... -
Java通过Executors提供四种线程池
2017-09-27 10:21 467Java通过Executors提供四种线程池,分别为: new ... -
Java同步注解(Annotation)解释
2017-09-18 18:18 1039JDK 5.0 以后增加了注解。就是@后面加一个名称。有其自身 ... -
url参数中出现+、空格、=、%、&、#等字符的解决办法
2017-03-08 15:31 596url出现了有+,空格,/,?,%,#,&,=等特殊符 ... -
Eclipse远程调试之Socket Attach与Socket Listen
2014-08-21 13:52 1691打个比方,被远程debug/监视 的进程就是一个风度翩翩的美少 ... -
关于java用jni调用 dll动态库Can't find dependent libraries错误的解决
2014-08-21 08:56 12311.package com.bsp.zauto.commo ... -
java 远程调试备忘
2013-12-11 16:45 874远程调试java程序 http://hi.baidu.com ... -
[转贴]System.getProperty()参数大全
2013-11-20 15:39 493一直做Web应用一般不会用到这些东西,今天在搞一个代码生成器的 ... -
Java Daemon线程
2013-09-05 13:27 617所谓守护线程就是运行 ... -
DelayQueue队列研究
2013-08-07 15:40 6731.DelayQueue 是一个无界的BlockingQue ... -
java 原语
2013-07-18 13:20 1184介绍 操作系统用语范畴 ... -
精巧好用的DelayQueue
2013-07-03 11:13 666我们谈一下实际的场景吧。我们在开发中,有如下场景 a) 关闭 ... -
log4j的配置文件备份.[成功测试]
2013-06-25 14:29 9401.在项目的config目录下,新建配置文件 log4j.xm ... -
log4j的xml配置详细
2013-06-24 13:48 617这是log4j默认的配置,我们先熟悉一下 <!-- ... -
java用log4j记录日志的基本方法
2013-06-24 10:57 586Log4j基本使用方法 Log4j由三个重要的组件构成: ... -
java 堆 栈
2013-06-21 16:53 603由String看Java堆栈问题,包括==以及equal()。 ... -
Java ThreadPoolExecutor思想介绍
2013-06-14 16:31 598一、简介 线程池类为 j ... -
java 中到底什么叫闭包
2013-03-26 13:24 1229什么是闭包 闭包的 ... -
java中的标签
2013-03-20 14:46 788Java中为了使程序结构更 ...
相关推荐
private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("jdk-thread-pool-%d").build(); private static final ExecutorService executorService = new ThreadPoolExecutor...
在JDK的源码使用工厂模式,ThreadFactory就是其中一种。 在我们一般的使用中,创建一个线程,通常有两种方式: 继承Thread类,覆盖run方法,实现我们需要的业务 继承Runnable接口,实现run方法,实现我们需要的业务,...
6. **threadFactory**:用于创建新线程的工厂。 7. **handler**:拒绝策略,当线程池和队列都满时,如何处理新提交的任务。 创建`ThreadPoolExecutor`实例后,可通过`execute()`方法提交`Runnable`任务,或通过`...
ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize || maximumPoolSize || maximumPoolSize || keepAliveTime ) throw new IllegalArgumentException(); if (workQueue =...
ThreadFactory threadFactory, RejectedExecutionHandler handler) ``` - **corePoolSize**:线程池的基本大小,在任何时间都会维持这么多线程。 - **maximumPoolSize**:线程池允许的最大线程数量。 - **...
首先会去判断当前线程池的线程数是否小于核心线程数,如果小于,那么就直接通过 ThreadFactory 创建一个线程来执行这个任务。 3.如果线程池里的线程数不再小于核心线程数,那么此时就会尝试将任务放入阻塞队列中,...
6. threadFactory:线程工厂,用于创建线程,主要是为了给线程起名字。 7. handler:拒绝策略,当线程池中的线程被耗尽,且队列也满了的时候会调用。 二、线程池执行流程 线程池的执行流程可以用一个图来说明: 1...
6. **线程工厂**(ThreadFactory threadFactory):创建新线程的工厂。 7. **拒绝策略**(RejectedExecutionHandler handler):当线程池和工作队列都满时,处理新任务的策略。 服务器端开发中,选择合适的线程池...
ThreadFactory接口用于定制线程的创建。在并发安全方面,Java的synchronized关键字、volatile变量、final字段以及Atomic类提供了多种锁和同步机制。此外,Java的内存模型涉及到可见性、有序性和原子性,是并发编程中...
threadFactory 创建线程的工厂 handler 拒绝策略 unit 是一个枚举,表示 keepAliveTime 的单位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7个可选值...
- `threadFactory`: 创建新线程的工厂。 - `handler`: 拒绝策略,当无法执行更多任务时使用。 - **底层实现**: - 通过`ExecutorService`接口和`ThreadPoolExecutor`实现类来创建和管理线程池。 #### 6. ...
- `threadFactory`:线程工厂。 - `handler`:拒绝策略。 5. **避免或解决死锁问题** - 使用`Thread.join()`合理安排线程顺序。 - 避免循环等待:设置合理的锁顺序。 - 使用工具类`DeadlockDetector`检测潜在...