a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 116|回复: 1

[基础知识] JAVA基础:Java线程池在使用中的问题实例解答

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
Java线程池需要我们不竭的进修,其实我们在使用的时辰仍是有不少问题需要我们解决。我们实现了一个简单的Java线程池。此刻我们就可以使用它了,下面的代码做了一个简单的示例:
# k+ n5 e3 l$ R2 E( y$ B2 {% D  Java代码" k5 `) w" z5 N$ E5 q( k
  1.public class SimpleTaskTest extends Task {
# p" M6 G* _7 b  2.@Override
4 a! L9 G+ }% O: s" S$ M0 o/ ?, c  3.public void deal() {
! L: G, H/ ^( c+ C/ Q8 r/ q  4.// do something1 ^; d( A( k, e5 B9 W/ a
  5.}; q! X' o0 p9 _0 A) D
  6.public static void main(String[] args) throws InterruptedException {5 F$ Y! ?4 c7 z+ x( |
  7.ThreadPoolService service = new ThreadPoolService();
/ d' ~* Q' o. q7 `3 S  8.service.start();* D5 j' D' K; l/ }) C4 M! g) c$ f
  9.// 执行十次使命
" K1 H' {4 x9 q* Y: {: ~* F5 G- n/ M  10.for (int i = 0; i < 10; i++) {
0 T1 e5 x) J+ ?6 o8 d2 B* ~) F( c  11.service.runTask(new SimpleTaskTest());0 z2 l% P% o  P% b
  12.}
1 i) ?! X; o) K$ C  13.// 睡眠1秒钟,期待所有使命执行完毕
" m0 g1 }# A$ y- H9 V  14.Thread.sleep(1000);
. _9 W3 }7 u- e* P" L# ~  15.service.stop();
; C2 c5 T6 t7 P- C' V  16.}  I* D: z) ?1 X+ l5 }" f" z/ c3 S
  17.}
  `  S6 o9 ]' G1 {8 U. y  18.public class SimpleTaskTest extends Task {
" M% b  F! a( {  Z3 o4 T3 z  19.@Override
& y0 T* d3 X, u4 i- {" d- G  20.public void deal() {
! G6 c( B% E2 w% [7 c2 {  R  21.// do something
8 w- w( \7 @) o! t# }1 z9 {  22.}
( [2 T# S! W7 W  23.public static void main(String[] args) throws InterruptedException {. x9 v/ S( a$ ]) |
  24.ThreadPoolService service = new ThreadPoolService();( x, r  C" e$ ?, `7 @
  25.service.start();" `9 V4 E8 [+ u8 Y* H
  26.// 执行十次使命
+ ~/ w5 _; H6 |$ }: A$ D3 X  27.for (int i = 0; i < 10; i++) {8 m& F1 }4 o% A# o$ G4 y' u
  28.service.runTask(new SimpleTaskTest());0 W# p% R: \" Q
  29.}* d( N+ X: h. `: d4 s1 b7 u
6 ~& c: U( b  v& T7 e3 ]
  30.// 睡眠1秒钟,期待所有使命执行完毕
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:Java线程池在使用中的问题实例解答

</p>  31.Thread.sleep(1000);
2 r+ u8 v2 L" ?& r  32.service.stop();) m) U  ?1 ]+ L% o
  33.}: ^" ?& A+ Q! c3 ?: T' |
  34.}
5 W2 L0 }/ `* O; }  当然,我们实现的是最简单的,这里只是为了演示Java线程池的实现事理。在现实应用中,按照情形的分歧,可以做良多优化。好比:, m( A! ^, y5 V! W  f. B
  调整使命队列的轨则,给使命设置优先级,级别高的使命优先执行。
0 m3 a+ Y( s. V  m1 E8 J- c  动态维护Java线程池,当待执行使命数目较多时,增添线程的数目,加速使命的执行速度;当使命较少时,收受接管一部门持久闲置的Java线程池,削减对系统资本的耗损。
& i) `3 Q, b1 g( j4 K' t- z+ Z  事实上Java5.0及以上版本已经为我们供给了线程池功能,无需再年夜头实现。这些类位于java.util.concurrent包中。
% t  x. \0 l7 E& M  Executors类供给了一组建树Java线程池对象的体例,常用的有一下几个:2 O6 e$ Z8 B( b' x1 O3 u
  Java代码
6 d, `% F. U  u; N2 E- I+ X  35.public static ExecutorService newCachedThreadPool() {
) m3 n3 h6 x4 j/ P# K" U0 u8 d" v0 x  36.// other code* K1 ]. Q/ |! X4 u
  37.}6 O8 H3 [4 K* X/ d
  38.public static ExecutorService newFixedThreadPool(int nThreads) {
9 n# m4 {( f1 a  39.// other code
% T# Q6 H1 S1 }/ N* |) D  40.}
) M% h7 |% a4 w0 ?  41.public static ExecutorService newSingleThreadExecutor() {
! x0 B3 E" a% ]% ^0 j& \  42.// other code
# T, X) `. }0 h% k+ Y  43.}1 u/ p1 j0 d, g6 N  N4 v
  44.public static ExecutorService newCachedThreadPool() {& }& n8 u) C5 N& Z5 E; a! K
  45.// other code8 g. R# K4 }9 C6 Q; h* Q0 a6 @& T
  46.}( l6 ^' |; W1 p
  47.public static ExecutorService newFixedThreadPool(int nThreads) {4 T9 b/ b6 w0 M7 a
  48.// other code
* a1 g9 E; B! a3 n+ m! m  49.}; e! Z8 _" H: C- b* x
  50.public static ExecutorService newSingleThreadExecutor() {- a8 n1 T1 y3 I" I: H6 n( ?; o
  51.// other code
& z  Y2 B3 D: }: j( U/ I  52.}$ A  u3 n5 {+ o
  newCachedThreadPool()体例建树一个动态的线程池,其中线程的数目会按照现实需要来建树和收受接管,适合于执行年夜量短期使命的情形;newFixedThreadPool(int nThreads)体例建树一个包含固定数目线程对象的Java线程池,nThreads代表要建树的线程数,如不美观某个线程在运行的过程中因为异常而终止了,那么一个新的线程会被建树和启动来庖代它;而newSingleThreadExecutor()体例例只在线程池中建树一个线程,来执行所有的使命。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-16 10:34 , Processed in 1.100792 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表