继承Thread和实现Runnable的区别,线程池

只能说是有继承Thread后不能再继承其他类了(因为java的单继承规则),什么资源不能共享都是扯淡,别把共享资源放在继承Thread类的子类中在外面调用Thread类的子类的类中放即可资源共享。

 

线程池:

结构图如下:(注意execute的参数必须是Runnable类型)

Executors类的五种创建线程池的方法最后都是调用的自定义线程池类ThreadPoolExecutor创建线程池的构造方法:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

 

使用示例:
Executor executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
Runtime.getRuntime().availableProcessors()指虚拟机可用的处理器数。此值只可用来创建计算密集型任务的线程池。

 

Executors类 五种创建线程池的区别:

newCachedThreadPool

1.有任务时才创建新线程,空闲线程被保留60秒。corePoolSize为0,maximumPoolSize可以无限大

2.一个可缓存的线程池,线程池大小可根据处理需要来变大。可灵活回收空闲线程,若无可回收的则新建线程。如果执行第二个任务时第一个任务已完成,则会复用执行第一个任务的线程,不会新建。

newFixedThreadPool

一个大小固定的线程池,可控制线程最大并发数。超出的线程会在队列中等待,空闲的线程会一直保留。corePoolSize和maximumPoolSize的大小是一样的

newScheduledThreadPool

 按时间来执行任务或周期性的执行任务的线程池

newSingleThreadExecutor

只有一个工作线程,依次执行每个任务,可以给任务指定优先级

newSingleThreadScheduledExecutor

只有一个工作线程,按时间来执行任务 

 

这样的话自己使用线程池的话可以考虑这两种方案:

1.创建线程数可灵活伸缩的线程池:newCachedThreadPool

2.评估实际情况中大概使用线程数量,创建自定义的线程池。核心线程数为评估得来的正常水平的线程数,最大线程数可以设的大一些。

 

 一个任务通过ThreadPoolExecutor的实例调用 execute(Runnable)方法被添加到线程池,也就是说任务先要赋值给一个线程对象然后再调用execute(Runnable)。任务的执行就是线程池中Runnable类型对象的run()方法的执行。

代码样例:http://blog.chinaunix.net/uid-20577907-id-3519578.html

          http://blog.csdn.net/wangwenhui11/article/details/6760474

线程数评估:

对于计算密集型的任务,线程池的大小设置为处理器数+1时(处理器数:Runtime.getRuntime().availableProcessors()),通常能实现最优的利用率。对于包含io操作或其他阻塞操作的任务,由于线程并不会一定执行,因此线程池的规模应该更大。要正确的设置线程池的大小,你必须估算出任务的等待时间与计算时间的比值。这种估算不需要很精确,并且可以通过一些分析或监控工具来获得。也可以通过另一种办法,在某个基准负载下,分别设置不同大小的线程池来运行程序,并观察CPU利用率的水平。
Nc=numbers of CPU
Uc=target CPU utilization(0到1之间)
W/C=ratio of wait time of compute time  
要使处理器达到期望的使用率,线程池的最优大小等于:
N=Nc*Uc*(1+W/C)

ps查看进程:

ps  -ef

-e   显示所有进程
-f    全格式

查看java进程ps  -ef|grep java,统计个数ps  -ef|grep java|wc -l

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值