Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaÏ̳߳ØÔ­ÀíÏê½â
 
À´Ô´£ºcsdn ·¢²¼ÓÚ 2017-2-27
  2093  次浏览      27
 

Executor¿ò¼ÜµÄÁ½¼¶µ÷¶ÈÄ£ÐÍ

ÔÚHotSpot VMµÄÄ£ÐÍÖУ¬JavaÏ̱߳»Ò»¶ÔÒ»Ó³ÉäΪ±¾µØ²Ù×÷ϵͳÏ̡߳£JAVAÏß³ÌÆô¶¯Ê±»á´´½¨Ò»¸ö±¾µØ²Ù×÷ϵͳỊ̈߳¬µ±JAVAÏß³ÌÖÕֹʱ£¬¶ÔÓ¦µÄ²Ù×÷ϵͳÏß³ÌÒ²±»Ïú»Ù»ØÊÕ£¬¶ø²Ù×÷ϵͳ»áµ÷¶ÈËùÓÐÏ̲߳¢½«ËüÃÇ·ÖÅ䏸¿ÉÓõÄCPU¡£

ÔÚÉϲ㣬JAVA³ÌÐò»á½«Ó¦Ó÷ֽâΪ¶à¸öÈÎÎñ£¬È»ºóʹÓÃÓ¦Óü¶µÄµ÷¶ÈÆ÷£¨Executor£©½«ÕâЩÈÎÎñÓ³Éä³É¹Ì¶¨ÊýÁ¿µÄỊ̈߳»Ôڵײ㣬²Ù×÷ϵͳÄں˽«ÕâЩÏß³ÌÓ³Éäµ½Ó²¼þ´¦ÀíÆ÷ÉÏ¡£

Executor¿ò¼ÜÀàͼ

ÔÚÇ°Ãæ½éÉܵÄJAVAÏ̼߳ÈÊǹ¤×÷µ¥Ôª£¬Ò²ÊÇÖ´ÐлúÖÆ¡£¶øÔÚExecutor¿ò¼ÜÖУ¬ÎÒÃǽ«¹¤×÷µ¥ÔªÓëÖ´ÐлúÖÆ·ÖÀ뿪À´¡£RunnableºÍCallableÊǹ¤×÷µ¥Ôª£¨Ò²¾ÍÊÇË׳ƵÄÈÎÎñ£©£¬¶øÖ´ÐлúÖÆÓÉExecutorÀ´Ìṩ¡£ÕâÑùÒ»À´ExecutorÊÇ»ùÓÚÉú²úÕßÏû·ÑÕßģʽµÄ£¬Ìá½»ÈÎÎñµÄ²Ù×÷Ï൱ÓÚÉú³ÉÕߣ¬Ö´ÐÐÈÎÎñµÄÏß³ÌÏ൱ÓÚÏû·ÑÕß¡£

1¡¢´ÓÀàͼÉÏ¿´£¬Executor½Ó¿ÚÊÇÒì²½ÈÎÎñÖ´Ðпò¼ÜµÄ»ù´¡£¬¸Ã¿ò¼ÜÄܹ»Ö§³Ö¶àÖÖ²»Í¬ÀàÐ͵ÄÈÎÎñÖ´ÐвßÂÔ¡£

public interface Executor {

void execute(Runnable command);
}

Executor½Ó¿Ú¾ÍÌṩÁËÒ»¸öÖ´Ðз½·¨£¬ÈÎÎñÊÇRunnbaleÀàÐÍ£¬²»Ö§³ÖCallableÀàÐÍ¡£

2¡¢ExecutorService½Ó¿ÚʵÏÖÁËExecutor½Ó¿Ú£¬Ö÷ÒªÌṩÁ˹رÕÏ̳߳غÍsubmit·½·¨£º

public interface ExecutorService extends Executor {

List<Runnable> shutdownNow();


boolean isTerminated();


<T> Future<T> submit(Callable<T> task);

}

ÁíÍâ¸Ã½Ó¿ÚÓÐÁ½¸öÖØÒªµÄʵÏÖÀࣺThreadPoolExecutorÓëScheduledThreadPoolExecutor¡£

ÆäÖÐThreadPoolExecutorÊÇÏ̳߳صĺËÐÄʵÏÖÀ࣬ÓÃÀ´Ö´Ðб»Ìá½»µÄÈÎÎñ£»¶øScheduledThreadPoolExecutorÊÇÒ»¸öʵÏÖÀ࣬¿ÉÒÔÔÚ¸ø¶¨µÄÑÓ³ÙºóÔËÐÐÈÎÎñ£¬»òÕß¶¨ÆÚÖ´ÐÐÃüÁî¡£

ÔÚÉÏһƪÎÄÕÂÖУ¬ÎÒÊÇʹÓÃThreadPoolExecutorÀ´Í¨¹ý¸ø¶¨²»Í¬µÄ²ÎÊý´Ó¶ø´´½¨×Ô¼ºËùÐèµÄÏ̳߳أ¬µ«ÊÇÔÚºóÃæµÄ¹¤×÷Öв»½¨ÒéÕâÖÖ·½Ê½£¬ÍƼöʹÓÃExectuors¹¤³§·½·¨À´´´½¨Ï̳߳Ø

ÕâÀïÏÈÀ´Çø±ðÏ̳߳غÍÏß³Ì×飨ThreadGroupÓëThreadPoolExecutor£©ÕâÁ½¸ö¸ÅÄ

a¡¢Ïß³Ì×é¾Í±íʾһ¸öÏ̵߳ļ¯ºÏ¡£

b¡¢Ï̳߳ØÊÇΪÏ̵߳ÄÉúÃüÖÜÆÚ¿ªÏúÎÊÌâºÍ×ÊÔ´²»×ãÎÊÌâÌṩ½â¾ö·½°¸£¬Ö÷ÒªÊÇÓÃÀ´¹ÜÀíÏ̡߳£

Executors¿ÉÒÔ´´½¨3ÖÖÀàÐ͵ÄThreadPoolExecutor£ºSingleThreadExecutor¡¢FixedThreadExecutorºÍCachedThreadPool

a¡¢SingleThreadExecutor£ºµ¥Ïß³ÌÏ̳߳Ø

ExecutorService threadPool = Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));

ÎÒÃÇ´ÓÔ´ÂëÀ´¿´¿ÉÒÔÖªµÀ£¬µ¥Ïß³ÌÏ̳߳صĴ´½¨Ò²ÊÇͨ¹ýThreadPoolExecutor£¬ÀïÃæµÄºËÐÄÏß³ÌÊýºÍÏß³ÌÊý¶¼ÊÇ1£¬²¢ÇÒ¹¤×÷¶ÓÁÐʹÓõÄÊÇÎÞ½ç¶ÓÁС£ÓÉÓÚÊǵ¥Ï̹߳¤×÷£¬Ã¿´ÎÖ»ÄÜ´¦ÀíÒ»¸öÈÎÎñ£¬ËùÒÔºóÃæËùÓеÄÈÎÎñ¶¼±»×èÈûÔÚ¹¤×÷¶ÓÁÐÖУ¬Ö»ÄÜÒ»¸ö¸öÈÎÎñÖ´ÐС£

b¡¢FixedThreadExecutor£º¹Ì¶¨´óСÏ̳߳Ø

ExecutorService threadPool = Executors.newFixedThreadPool(5);

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}

Õâ¸öÓëµ¥Ïß³ÌÀàËÆ£¬Ö»ÊÇ´´½¨Á˹̶¨´óСµÄÏß³ÌÊýÁ¿¡£

c¡¢CachedThreadPool:ÎÞ½çÏ̳߳Ø

ExecutorService threadPool = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}

ÎÞ½çÏ̳߳ØÒâζ×ÅûÓй¤×÷¶ÓÁУ¬ÈÎÎñ½øÀ´¾ÍÖ´ÐУ¬Ïß³ÌÊýÁ¿²»¹»¾Í´´½¨£¬ÓëÇ°ÃæÁ½¸öµÄÇø±ðÊÇ£º¿ÕÏеÄÏ̻߳ᱻ»ØÊÕµô£¬¿ÕÏеÄʱ¼äÊÇ60s¡£Õâ¸öÊÊÓÃÓÚÖ´Ðкܶà¶ÌÆÚÒì²½µÄС³ÌÐò»òÕ߸ºÔؽÏÇáµÄ·þÎñÆ÷¡£

Callable¡¢Future¡¢FutureTashÏê½â

CallableÓëFutureÊÇÔÚJAVAµÄºóÐø°æ±¾ÖÐÒýÈë½øÀ´µÄ£¬CallableÀàËÆÓÚRunnable½Ó¿Ú£¬ÊµÏÖCallable½Ó¿ÚµÄÀàÓëʵÏÖRunnableµÄÀà¶¼ÊÇ¿ÉÒÔ±»Ïß³ÌÖ´ÐеÄÈÎÎñ¡£

ÈýÕßÖ®¼äµÄ¹ØÏµ£º

CallableÊÇRunnable·â×°µÄÒì²½ÔËËãÈÎÎñ¡£

FutureÓÃÀ´±£´æCallableÒì²½ÔËËãµÄ½á¹û

FutureTask·â×°FutureµÄʵÌåÀà

1¡¢CallableÓëRunnbaleµÄÇø±ð

a¡¢Callable¶¨ÒåµÄ·½·¨ÊÇcall£¬¶øRunnable¶¨ÒåµÄ·½·¨ÊÇrun¡£

b¡¢call·½·¨Óзµ»ØÖµ£¬¶ørun·½·¨ÊÇûÓзµ»ØÖµµÄ¡£

c¡¢call·½·¨¿ÉÒÔÅ׳öÒì³££¬¶ørun·½·¨²»ÄÜÅ׳öÒì³£¡£

2¡¢Future

Future±íʾÒì²½¼ÆËãµÄ½á¹û£¬ÌṩÁËÒÔÏ·½·¨£¬Ö÷ÒªÊÇÅжÏÈÎÎñÊÇ·ñÍê³É¡¢ÖжÏÈÎÎñ¡¢»ñÈ¡ÈÎÎñÖ´Ðнá¹û

 1 public interface Future<V> {
2
3 boolean cancel(boolean mayInterruptIfRunning);
4
5 boolean isCancelled();
6
7 boolean isDone();
8
9 V get() throws InterruptedException, ExecutionException;
10
11 V get(long timeout, TimeUnit unit)
12 throws InterruptedException, ExecutionException, TimeoutException;
13 }

3¡¢FutureTask

¿ÉÈ¡ÏûµÄÒì²½¼ÆË㣬´ËÀàÌṩÁ˶ÔFutureµÄ»ù±¾ÊµÏÖ£¬½öÔÚ¼ÆËãÍê³Éʱ²ÅÄÜ»ñÈ¡½á¹û£¬Èç¹û¼ÆËãÉÐδÍê³É£¬Ôò×èÈûget·½·¨¡£

public class FutureTask<V> implements RunnableFuture<V>

public interface RunnableFuture<V> extends Runnable, Future<V>

FutureTask²»½öʵÏÖÁËFuture½Ó¿Ú£¬»¹ÊµÏÖÁËRunnable½Ó¿Ú£¬ËùÒÔ²»½ö¿ÉÒÔ½«FutureTaskµ±³ÉÒ»¸öÈÎÎñ½»¸øExecutorÀ´Ö´ÐУ¬»¹¿ÉÒÔͨ¹ýThreadÀ´´´½¨Ò»¸öÏ̡߳£

CallableÓëFutureTask

¶¨ÒåÒ»¸öcallableµÄÈÎÎñ£º

public class MyCallableTask implements Callable<Integer>
2 {
3 @Override
4 public Integer call()
5 throws Exception
6 {
7 System.out.println("callable do somothing");
8 Thread.sleep(5000);
9 return new Random().nextInt(100);
10 }
11 }
public class CallableTest
2 {
3 public static void main(String[] args) throws Exception
4 {
5 Callable<Integer> callable = new MyCallableTask();
6 FutureTask<Integer> future = new FutureTask<Integer>(callable);
7 Thread thread = new Thread(future);
8 thread.start();
9 Thread.sleep(100);
10 //³¢ÊÔÈ¡Ïû¶Ô´ËÈÎÎñµÄÖ´ÐÐ
11 future.cancel(true);
12 //ÅжÏÊÇ·ñÔÚÈÎÎñÕý³£Íê³ÉǰȡÏû
13 System.out.println("future is cancel:" + future.isCancelled());
14 if(!future.isCancelled())
15 {
16 System.out.println("future is cancelled");
17 }
18 //ÅжÏÈÎÎñÊÇ·ñÒÑÍê³É
19 System.out.println("future is done:" + future.isDone());
20 if(!future.isDone())
21 {
22 System.out.println("future get=" + future.get());
23 }
24 else
25 {
26 //ÈÎÎñÒÑÍê³É
27 System.out.println("task is done");
28 }
29 }
30 }

Ö´Ðнá¹û£º

callable do somothing
future is cancel:true
future is done:true
task is done

Õâ¸öDEMOÖ÷ÒªÊÇͨ¹ýµ÷ÓÃFutureTaskµÄ״̬ÉèÖõķ½·¨£¬ÑÝʾÁË״̬µÄ±äǨ¡£

a¡¢µÚ11ÐУ¬³¢ÊÔÈ¡Ïû¶ÔÈÎÎñµÄÖ´ÐУ¬¸Ã·½·¨Èç¹ûÓÉÓÚÈÎÎñÒÑÍê³É¡¢ÒÑÈ¡ÏûÔò·µ»Øfalse£¬Èç¹ûÄܹ»È¡Ïû»¹Î´Íê³ÉµÄÈÎÎñ£¬Ôò·µ»Øtrue£¬¸ÃDEMOÖÐÓÉÓÚÈÎÎñ»¹ÔÚÐÝÃß״̬£¬ËùÒÔ¿ÉÒÔÈ¡Ïû³É¹¦¡£

future.cancel(true);

b¡¢µÚ13ÐУ¬ÅжÏÈÎÎñÈ¡ÏûÊÇ·ñ³É¹¦£ºÈç¹ûÔÚÈÎÎñÕý³£Íê³Éǰ½«ÆäÈ¡Ïû£¬Ôò·µ»Øtrue

System.out.println("future is cancel:" + future.isCancelled());

c¡¢µÚ19ÐУ¬ÅжÏÈÎÎñÊÇ·ñÍê³É£ºÈç¹ûÈÎÎñÍê³É£¬Ôò·µ»Øtrue£¬ÒÔϼ¸ÖÖÇé¿ö¶¼ÊôÓÚÈÎÎñÍê³É£ºÕý³£ÖÕÖ¹¡¢Òì³£»òÕßÈ¡Ïû¶øÍê³É¡£

ÎÒÃǵÄDEMOÖУ¬ÈÎÎñÊÇÓÉÓÚÈ¡Ïû¶øµ¼ÖÂÍê³É¡£

System.out.println("future is done:" + future.isDone());

d¡¢ÔÚµÚ22ÐУ¬»ñÈ¡Òì²½Ïß³ÌÖ´ÐеĽá¹û£¬ÎÒÕâ¸öDEMOÖÐûÓÐÖ´Ðе½ÕâÀÐèҪעÒâµÄÊÇ£¬future.get·½·¨»á×èÈûµ±Ç°Ị̈߳¬ Ö±µ½ÈÎÎñÖ´ÐÐÍê³É·µ»Ø½á¹ûΪֹ¡£

System.out.println("future get=" + future.get());

CallableÓëFuture

public class CallableThread implements Callable<String>
{
@Override
public String call()
throws Exception
{
System.out.println
("½øÈëCall·½·¨£¬¿ªÊ¼ÐÝÃߣ¬ÐÝÃßʱ¼äΪ£º
" + System.currentTimeMillis());
Thread.sleep(10000);
return "½ñÌìÍ£µç";
}

public static void main(String[] args) throws Exception
{
ExecutorService es = Executors.newSingleThreadExecutor();
Callable<String> call = new CallableThread();
Future<String> fu = es.submit(call);
es.shutdown();
Thread.sleep(5000);
System.out.println("Ö÷Ïß³ÌÐÝÃß5Ã룬
µ±Ç°Ê±¼ä" + System.currentTimeMillis());
String str = fu.get();
System.out.println("FutureÒÑÄõ½Êý¾Ý£¬str=" + str + ";µ±Ç°Ê±¼äΪ£º" + System.currentTimeMillis());
}
}

Ö´Ðнá¹û£º

½øÈëCall·½·¨£¬¿ªÊ¼ÐÝÃߣ¬ÐÝÃßʱ¼äΪ£º1478606602676
Ö÷Ïß³ÌÐÝÃß5Ã룬µ±Ç°Ê±¼ä1478606608676
FutureÒÑÄõ½Êý¾Ý£¬str=½ñÌìÍ£µç;µ±Ç°Ê±¼äΪ£º1478606612677

ÕâÀïµÄfutureÊÇÖ±½ÓÈÓµ½Ï̳߳ØÀïÃæÈ¥Ö´Ðеġ£ÓÉÓÚÒª´òÓ¡ÈÎÎñµÄÖ´Ðнá¹û£¬ËùÒÔ´ÓÖ´Ðнá¹ûÀ´¿´£¬Ö÷Ïß³ÌËäÈ»ÐÝÃßÁË5s£¬µ«ÊÇ´ÓCall·½·¨Ö´Ðе½Äõ½ÈÎÎñµÄ½á¹û£¬ÕâÖмäµÄʱ¼ä²îÕýºÃÊÇ10s£¬ËµÃ÷get·½·¨»á×èÈûµ±Ç°Ïß³ÌÖ±µ½ÈÎÎñÍê³É¡£

ͨ¹ýFutureTaskÒ²¿ÉÒԴﵽͬÑùµÄЧ¹û£º

public static void main(String[] args) throws Exception
{
ExecutorService es = Executors.newSingleThreadExecutor();
Callable<String> call = new CallableThread();
FutureTask<String> task = new FutureTask<String>(call);
es.submit(task);
es.shutdown();
Thread.sleep(5000);
System.out.println
("Ö÷Ï̵߳ȴý5Ã룬µ±Ç°Ê±¼äΪ£º" + System.currentTimeMillis());
String str = task.get();
System.out.println
("FutureÒÑÄõ½Êý¾Ý£¬
str=" + str + ";µ±Ç°Ê±¼äΪ£º" + System.currentTimeMillis());
}

ÒÔÉϵÄ×éºÏ¿ÉÒÔ¸øÎÒÃÇ´øÀ´ÕâÑùµÄһЩ±ä»¯£º

ÈçÓÐÒ»ÖÖ³¡¾°ÖУ¬·½·¨A·µ»ØÒ»¸öÊý¾ÝÐèÒª10s,A·½·¨ºóÃæµÄ´úÂëÔËÐÐÐèÒª20s£¬µ«ÊÇÕâ20sµÄÖ´Ðйý³ÌÖУ¬Ö»ÓкóÃæ10sÒÀÀµÓÚ·½·¨AÖ´ÐеĽá¹û¡£Èç¹ûÓëÒÔÍùÒ»Ñù²ÉÓÃͬ²½µÄ·½Ê½£¬ÊƱػáÓÐ10sµÄʱ¼ä±»ÀË·Ñ£¬Èç¹û²ÉÓÃÇ°ÃæÁ½ÖÖ×éºÏ£¬ÔòЧÂÊ»áÌá¸ß£º

1¡¢ÏȰÑA·½·¨µÄÄÚÈݷŵ½CallableʵÏÖÀàµÄcall()·½·¨ÖÐ

2¡¢ÔÚÖ÷Ïß³ÌÖÐͨ¹ýÏ̳߳ØÖ´ÐÐAÈÎÎñ

3¡¢Ö´ÐкóÃæ·½·¨ÖÐ10Ãë²»ÒÀÀµ·½·¨AÔËÐнá¹ûµÄ´úÂë

4¡¢»ñÈ¡·½·¨AµÄÔËÐнá¹û£¬Ö´ÐкóÃæ·½·¨ÖÐ10ÃëÒÀÀµ·½·¨AÔËÐнá¹ûµÄ´úÂë

ÕâÑù´úÂëÖ´ÐÐЧÂÊÒ»ÏÂ×Ó¾ÍÌá¸ßÁË£¬³ÌÐò²»±Ø¿¨ÔÚA·½·¨´¦¡£

   
2093 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ