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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
java¶àÏß³Ì×ܽá¶þ
 
×÷ÕߣºRollen Holt À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ 2015-8-31
  1951  次浏览      27
 

Ïß³ÌÒ»°ãÓÐ6¸ö״̬£º

н¨×´Ì¬£ºNEW

¿ÉÔËÐÐ״̬£ºRUNNABLE

ÐÝÃß״̬£ºTIMED_WAITING

µÈ´ý״̬£ºWAITING

×èÈû״̬:BLOCKED

ÖÕֹ״̬¡°TERMINATED

µ±ÎÒÃÇʹÓÃnew´´½¨Ïß³ÌÖ®ºó£¬Ï̴߳¦ÓÚн¨×´Ì¬£¬µ±µ÷ÓÃstart·½·¨Ö®ºó£¬Ï̳߳öÓÚ¿ÉÔËÐÐ״̬£¬µ±Ïß³ÌÐèÒª»ñµÃ¶ÔÏóµÄÄÚÖÃËø£¬¶øÕâ¸öËø±»ÆäËûÏß³ÌËùÕ¼ÓõÄʱºò£¬Ï߳̾ͳöÓÚ×èÈû״̬£¬µ±Ï̵߳ȴýÆäËûÏß³Ì֪ͨµ÷¶È±í¿ÉÒÔÔËÐÐʱ£¬Ï̴߳¦Óڵȴý״̬£¬µ±Ò»¸öº¬ÓÐʱ¼ä²ÎÊýµÄ·½·¨£¬±ØÐësleep£¨£©·½·¨£¬¿ÉÒÔÈÃÏ̴߳¦ÓÚ¼ÆÊ±µÈ´ý״̬£¬µ±run£¨£©·½·¨ÔËÐÐÍê±Ï»òÕß³öÏÖÒì³££¬Ï̴߳¦ÓÚÖÕֹ״̬¡£


package Thread;

public class ThreadStateDemo{

public static void main(String[] args) throws Exception{

ThreadState state = new ThreadState();

Thread demo = new Thread(state);

System.out.println("н¨×´Ì¬£º" + demo.getState());

demo.start();

System.out.println("¿ÉÔËÐÐ״̬£º" + demo.getState());

Thread.sleep(100);

System.out.println("ÐÝÃß״̬£º" + demo.getState());

Thread.sleep(1000);

System.out.println("µÈ´ý״̬£º" + demo.getState());

state.notifyWait();

System.out.println("×èÈû״̬:" + demo.getState());

Thread.sleep(1000);

System.out.println("ÖÕֹ״̬¡°" + demo.getState());

}

}

class ThreadState implements Runnable{

@Override

public void run(){

try{

waitForASecond();

waitForAYear();

}catch(Exception e){

e.printStackTrace();

}

}

// µ±Ç°Ï̵߳ȴý1Ãë

public synchronized void waitForASecond() throws Exception{

wait(1000);

}

// µ±Ç°Ïß³ÌÒ»Ö±µÈ´ý

public synchronized void waitForAYear() throws Exception{

wait();

}

// »½ÐÑÏß³Ì

public synchronized void notifyWait() throws Exception{

notify();

}

}

¡¾ÔËÐнá¹û¡¿£º

н¨×´Ì¬£ºNEW

¿ÉÔËÐÐ״̬£ºRUNNABLE

ÐÝÃß״̬£ºTIMED_WAITING

µÈ´ý״̬£ºWAITING

×èÈû״̬:BLOCKED

ÖÕֹ״̬¡°TERMINATED

Ïß³Ì×é±íʾһ¸öÏß³ÌÏ̵߳ļ¯ºÏ£¬Ïß³Ì×éÖÐÒ²¿ÉÒÔ°üº¬ÆäËûµÄÏß³Ì×é¡£Ïß³Ì×é¹¹³ÉÒ»¿ÃÊ÷¡£


package Thread;

import java.util.ArrayList;

import java.util.List;

public class ThreadGroupDemo{

public static void main(String[] args){

for(String str : getThreadGroups(GetRootThreadGroups())){

System.out.println(str);

}

}

// »ñµÃ¸ùÏß³Ì×é

private static ThreadGroup GetRootThreadGroups(){

// »ñµÃµ±Ç°µÄÏß³Ì×é

ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();

while(true){

if(rootGroup.getParent() != null){

rootGroup = rootGroup.getParent();

}else{

break;

}

}

return rootGroup;

}

// »ñµÃ¸ø¶¨Ïß³Ì×éÖÐËùÓÐÏß³ÌÃû

public static List<String> getThreads(ThreadGroup group){

List<String> threadList = new ArrayList<String>();

Thread[] threads = new Thread[group.activeCount()];

int count = group.enumerate(threads, false);

for(int i = 0; i < count; i++){

threadList.add(group.getName() + " Ïß³Ì×é " + threads[i].getName());

}

return threadList;

}

// »ñµÃÏß³Ì×éÖÐËùÓÐ×ÓÏß³Ì×é

public static List<String> getThreadGroups(ThreadGroup group){

List<String> threadList = getThreads(group);

ThreadGroup[] groups = new ThreadGroup[group.activeGroupCount()];

int count = group.enumerate(groups, false);

for(int i = 0; i < count; i++){

threadList.addAll(getThreads(groups[i]));

}

return threadList;

}

}

¡¾ÔËÐнá¹û¡¿£º

system Ïß³Ì×é Reference Handler

system Ïß³Ì×é Finalizer

system Ïß³Ì×é Signal Dispatcher

system Ïß³Ì×é Attach Listener

main Ïß³Ì×é main

ʹÓÃÊØ»¤Ïß³Ì

javaÖеÄÏ̷߳ÖΪ2À࣬Óû§Ï̺߳ÍÊØ»¤Ị̈߳¬ÊØ»¤Ïß³ÌÖ÷ҪΪÆäËûÏß³ÌÌṩ·þÎñ£¬ÊØ»¤Ï̻߳áËæÊ±±»Öжϣ¬ËùÒÔÒ»°ã²»ÒªÔÙÊØ»¤Ïß³ÌÖÐʹÓÃÐèÒªÊÍ·Å×ÊÔ´µÄ×ÊÔ´£¬±ÈÈçÊäÈëÊä³öÁ÷µÈ£¬ÊØ»¤Ïß³ÌÒ»°ã¶¼ÊǺǫ́Ị̈߳¬Èç¹ûÐéÄâ»úֻʣÏÂÊØ»¤Ị̈߳¬ÐéÄâ»ú¾Í»áÍ˳ö¡£


package Thread;

public class DaemonThreadTest{

public static void main(String[] args){

Thread worker = new Thread(new Worker());

Thread timer = new Thread(new Timer());

//ÉèÖÃÊØ»¤Ïß³Ì

timer.setDaemon(true);

worker.start();

timer.start();

}

}

class Worker implements Runnable{

@Override

public void run(){

for(int i = 0; i < 5; ++i){

System.out.println("rollenÕæË§! µÚ" + i + "´Î");

}

}

}

class Timer implements Runnable{

@Override

public void run(){

long currentTime = System.currentTimeMillis();

long processTime = 0;

while(true){

if((System.currentTimeMillis() - currentTime) > processTime){

processTime = System.currentTimeMillis() - currentTime;

System.out.println("³ÌÐòÔËÐÐʱ¼ä£º" + processTime);

}

}

}

}

rollenÕæË§! µÚ0´Î

³ÌÐòÔËÐÐʱ¼ä£º1

³ÌÐòÔËÐÐʱ¼ä£º2

³ÌÐòÔËÐÐʱ¼ä£º3

³ÌÐòÔËÐÐʱ¼ä£º4

³ÌÐòÔËÐÐʱ¼ä£º5

rollenÕæË§! µÚ1´Î

rollenÕæË§! µÚ2´Î

rollenÕæË§! µÚ3´Î

rollenÕæË§! µÚ4´Î

³ÌÐòÔËÐÐʱ¼ä£º6

ÖÕÖ¹Ö¸¶¨µÄÏß³Ì

ËäÈ»ÔÚThreadÀàÖÐÌṩÁËstop£¨£©·½·¨¿ÉÒÔÖÕÖ¹Ị̈߳¬µ«ÊÇÓÉÓÚÆä¹ÌÓеIJ»°²È«ÐÔ£¬ËùÒÔÒ»°ã²»Òª²ÉÓ㬱¾Àý×ÓÖ»ÊÇÆðµ½Å×שÒýÓñµÄ×÷Óá£


package Thread;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

public class ThreadStopDemo extends JFrame{

public ThreadStopDemo(){

panel.setLayout(new FlowLayout(FlowLayout.CENTER));

panel.add(label);

panel.add(startButton);

panel.add(endButton);

setContentPane(panel);

setSize(200, 300);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

startButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e){

counter = new CounterThread();

new Thread(counter).start();

}

});

endButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e){

if(counter == null){

return;

}

counter.setStop(false);

}

});

}

public static void main(String[] args){

new ThreadStopDemo();

}

class CounterThread implements Runnable{

@Override

public void run(){

while(this.flag){

try{

Thread.sleep(500);

}catch(Exception e){

e.printStackTrace();

}

label.setText("¸üÐÂ" + (count++) + "¸üÐÂ");

}

}

public void setStop(boolean flag){

this.flag = flag;

}

private int count = 0;

private boolean flag = true;

}

private CounterThread counter = null;

private final JPanel panel = new JPanel();

private final JLabel label = new JLabel("¸üÐÂ0´Î");

private final JButton startButton = new JButton("¿ªÊ¼");

private final JButton endButton = new JButton("½áÊø");

}

¡¾ÔËÐнá¹û¡¿£º

Ï̵߳IJå¶Ó

ÔÚ±àд¶àÏ̵߳ijÌÐòµÄʱºò£¬¾­³£»áÓöµ½ÈÃÒ»¸öÏß³ÌÓÅÏÈÓÚÁíÍâi¸öÏß³ÌÔËÐеÄÇé¿ö£¬´Ëʱ£¬³ýÁËÉèÖÃÕâ¸öÏ̵߳ÄÓÅÏȼ¶¸ß£¨²»ÍƼöÕâÖÖ·½·¨£©Ö®Í⣬¸ü¼ÓÖ±½ÓµÄ°ì·¨ÊDzÉÓÃThreadÀàÖеÄjoin£¨£©·½·¨¡£µ±²å¶ÓµÄÏß³ÌÔËÐнáÊøÖ®ºó£¬ÆäËûµÄÏ̲߳ÅÄÜÔËÐС£


package Thread;

public class ThreadJoinDemo{

public static void main(String[] args){

Thread demo1 = new Thread(new EmergencyThread());

demo1.start();

for(int i = 0; i < 5; ++i){

try{

Thread.sleep(100);

}catch(InterruptedException e){

e.printStackTrace();

}

System.out.println("Õý³£Çé¿ö :" + i + "ºÅ³µ¿ªÊ¼³ö·¢");

try{

//¿ªÊ¼²å¶Ó

demo1.join();

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

}

class EmergencyThread implements Runnable{

@Override

public void run(){

for(int i = 0; i < 5; ++i){

try{

Thread.sleep(100);

}catch(InterruptedException e){

e.printStackTrace();

}

System.out.println("½ô¼±Çé¿ö £º" + i + "ºÅ³µ¿ªÊ¼³ö·¢");

}

}

}

¡¾ÔËÐнá¹û¡¿£º

Õý³£Çé¿ö :0ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º0ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º1ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º2ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º3ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º4ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :1ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :2ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :3ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :4ºÅ³µ¿ªÊ¼³ö·¢

Èç¹ûÎÒÃÇÈ¥µôjoinÄÄÒ»Ðеϰ£¬ÔËÐнá¹û£º£¨½á¹û²»Î¨Ò»£©

½ô¼±Çé¿ö£º0ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :0ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º1ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :1ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :2ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º2ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º3ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :3ºÅ³µ¿ªÊ¼³ö·¢

Õý³£Çé¿ö :4ºÅ³µ¿ªÊ¼³ö·¢

½ô¼±Çé¿ö£º4ºÅ³µ¿ªÊ¼³ö·¢

Ï̵߳Äͬ²½

¶àÏ̱߳à³ÌµÄÒ»¸öÖØÒªÔ­ÒòÊÇʵÏÖÊý¾ÝµÄ¹²Ïí£¬µ«ÊÇÈç¹ûÁ½¸öÏß³ÌͬʱÐÞ¸ÄÒ»¸öÊý¾ÝµÄ»°£¬Ôò»á²úÉúͬ²½ÎÊÌâ¡£

ÏÂÃæ²ÉÓÃÒ»¸ö2¸öÈËͬʱÍùÒøÐдæÇ®µÄÀý×Ó£¬ÒøÐп¨³õʼ½ð¶îΪ100Ôª¡£Ã¿´Î´æ10Ôª£¬´ó¼Ò×Ðϸ²é¿´Óà¶î¡££¨¶ÔÓÚ¼òµ¥µÄ¶àỊ̈߳¬³ö´íµÄ¸ÅÂʺÜС£¬½ñÌìºÜ²»ÇÉ£¬ÎÒÒ»ÏòµØÏµÄRP½ñÌì¾ÓÈ»±¬·¢ÁË£¬ÊµÑéÁ˺ܶà´Î£¬¶¼Ã»´í£¬×îºóÖÕÓÚ³öÏÖÁË£©

ÏÈ¿´Ò»Ï½á¹û°É£º

°¸Àý˵Á½²à²»ÄܳöÏÖÒ»ÑùÓà¶îµÄ¡£

´úÂëÈçÏ£º


package Thread;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

public class UnSynBank extends JFrame{

public UnSynBank(){

panel.setLayout(new GridLayout(2, 2, 3, 3));

panel.add(label1);

panel.add(label2);

JScrollPane js1 = new JScrollPane(oneArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js1);

JScrollPane js2 = new JScrollPane(twoArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js2);

panel2.add(panel);

panel2.add(statrButton);

setContentPane(panel2);

statrButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e){

Thread demo1 = new Thread(new Transfer(bank, oneArea));

demo1.start();

Thread demo2 = new Thread(new Transfer(bank, twoArea));

demo2.start();

}

});

setSize(300, 400);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args){

new UnSynBank();

}

private final Bank bank = new Bank();

JPanel panel = new JPanel();

JPanel panel2 = new JPanel();

private final JButton statrButton = new JButton("¿ªÊ¼´æÇ®");

private final JLabel label1 = new JLabel("Ò»ºÅÏß³Ì");

private final JLabel label2 = new JLabel("¶þºÅÏß³Ì");

private final JTextArea oneArea = new JTextArea(5, 10);

private final JTextArea twoArea = new JTextArea(5, 10);

}

/**

* ±íÊ¾ÒøÐеÄÀà

* */

class Bank{

public Bank(){

}

public void deposit(int money){

account += money;

}

public int getAccount(){

return account;

}

private int account = 100;

}

/**

* ±íʾÍùÕË»§´æÇ®

* */

class Transfer implements Runnable{

public Transfer(){

}

public Transfer(Bank bank, JTextArea textArea){

this.bank = bank;

this.textArea = textArea;

}

@Override

public void run(){

for(int i = 0; i < 20; ++i){

bank.deposit(10);

String str = textArea.getText();

textArea.setText(str + "ÕË»§Óà¶îΪ£º" + bank.getAccount() + "\n");

}

}

private Bank bank = null;

private JTextArea textArea = null;

}

ÒòΪһ¸ö½ø³ÌÖеÄËùÓÐÏ̻߳ṲÏí½ø³ÌÖеÄ×ÊÔ´£¬ËùÒÔµ±Ò»¸öÏ̻߳¹Ã»Óн«ÐÞ¸ÄÖ®ºóµÄ½á¹û±£´æµÄʱºò£¬ÁíÍâÒ»¸öÏß³ÌÈ´½øÐжÁÈ¡£¬ÕâÑù×ÔÈ»»á²úÉú´íÎó£¬ËùÒÔÕâ¸öʱºò¾ÍÐèÒªÎÒÃDzÉÓÃͬ²½À´½â¾öÎÊÌâµÄ¡£

ʹÓÃͬ²½·½·¨ÊµÏÖͬ²½

Ëùνͬ²½·½·¨£¬¾ÍÊÇÓÃsynchronizedÐÞÊεķ½·¨£¬Ö®ËùÒÔÕâÊ®¼¸¸ö×ÖĸÄܽâ¾öÀ§ÄѵÄͬ²½ÎÊÌ⣬ÕâÊǺÍjavaÖеÄÄÚÖÃËøÃÜÇÐÏà¹ØµÄ£¬Ã¿Ò»¸öjava¶ÔÏóÖÐÓÐÒ»¸öÄÚÖÃËø£¬Èç¹û·½·¨Ê¹ÓÃÁËsynchronized½øÐÐÐÞÊεϰ£¬ÄÚÖÃËø»á±£»¤Õû¸ö·½·¨£¬Ò²¾ÍÊÇÔÚµ÷Ó÷½·¨Ö®Ç°£¬ÐèÒª¡¢»ñµÃÄÚÖÃËø£¬·ñÔò¾Í»á´¦ÓÚ×èÈû״̬£¬µ±È»Õâ¸ö¹Ø¼ü×ÖÒ²¿ÉÒÔÐÞÊξ²Ì¬·½·¨£¬Èç¹ûµ÷Óþ²Ì¬·½·¨£¬¾Í»áËø×¡Õû¸öÀà

µ«ÊÇÒªÌáÐÑһϴó¼Ò£¬Í¬²½ÊÇÒ»Öָ߿ªÏúµÄ²Ù×÷£¬ËùÒÔÓ¦¸Ã¾¡Á¿¼õÉÙÐèҪͬ²½µÄÄÚÈÝ

ʹÓÃÌØÊâÓò±äÁ¿ÊµÏÖͬ²½

volatileÌṩÁËÒ»ÖÖÃâËøµÄ»úÖÆ£¬Ê¹ÓÃÕâ¸ö¹Ø¼ü×ÖÐÞÊεÄÓòÏ൱ÓÚ¸æËßÐéÄâ»ú£¬Õâ¸öÓò¿ÉÄܻᱻÆäËûµÄÏ̸߳úУ¬Òò´Ëÿ´Î¶ÁÈ¡Õâ¸öÓòµÄʱºò¶¼ÐèÒªÖØÐ¼ÆË㣬¶ø²»ÊÇʹÓüĴæÆ÷ÖеÄÖµ£¬Õâ¸ö¹Ø¼ü×Ö²»»áÌṩÈκεÄÔ­×Ó²Ù×÷£¬Ò²²»ÄÜÓÃÀ´ÐÞÊÎfinalÀàÐ͵ıäÁ¿¡¢

Ð޸ĺó´úÂëΪ£º


package com.java;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

public class UnSynBank extends JFrame{

public UnSynBank(){

panel.setLayout(new GridLayout(2, 2, 3, 3));

panel.add(label1);

panel.add(label2);

JScrollPane js1 = new JScrollPane(oneArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js1);

JScrollPane js2 = new JScrollPane(twoArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js2);

panel2.add(panel);

panel2.add(statrButton);

setContentPane(panel2);

statrButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e){

Thread demo1 = new Thread(new Transfer(bank, oneArea));

demo1.start();

Thread demo2 = new Thread(new Transfer(bank, twoArea));

demo2.start();

}

});

setSize(300, 400);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args){

new UnSynBank();

}

private final Bank bank = new Bank();

JPanel panel = new JPanel();

JPanel panel2 = new JPanel();

private final JButton statrButton = new JButton("¿ªÊ¼´æÇ®");

private final JLabel label1 = new JLabel("Ò»ºÅÏß³Ì");

private final JLabel label2 = new JLabel("¶þºÅÏß³Ì");

private final JTextArea oneArea = new JTextArea(5, 10);

private final JTextArea twoArea = new JTextArea(5, 10);

}

/**

* ±íÊ¾ÒøÐеÄÀà

* */

class Bank{

public Bank(){

}

public synchronized void deposit(int money){

account += money;

}

public int getAccount(){

return account;

}

private volatile int account = 100;

}

/**

* ±íʾÍùÕË»§´æÇ®

* */

class Transfer implements Runnable{

public Transfer(){

}

public Transfer(Bank bank, JTextArea textArea){

this.bank = bank;

this.textArea = textArea;

}

@Override

public void run(){

for(int i = 0; i < 20; ++i){

bank.deposit(10);

String str = textArea.getText();

textArea.setText(str + "ÕË»§Óà¶îΪ£º" + bank.getAccount() + "\n");

}

}

private Bank bank = null;

private JTextArea textArea = null;

}

ÌáÐÑһϣº¹ØÓÚ°²È«ÓòµÄ²¢·¢·ÃÎÊ£º

¶àÏß³ÌÖеķÇͬ²½ÎÊÌâ³öÏÖÔÚ¶ÔÓÚÓòµÄ¶ÁдÉϵÄʱºò£¬Èç¹ûÈÃÓò×ÔÉí±ÜÃâÕâ¸öÎÊÌâµÄ»°£¬Ôò²»ÐèÒªÐ޸IJÙ×÷µÄ·½·¨£¬ÔÚjavaÖÐÓÐ3ÖÐÓò×ÔÉí¾Í¿ÉÒÔ±ÜÃâ·Çͬ²½ÎÊÌ⣺finalÓò£¬Ê¹ÓÃvolatileÓò£¬ÒÔ¼°ÓÐËø±£»¤µÄÓò¡£

ʹÓÃÖØÈëËøÊµÏÖÏß³Ìͬ²½


import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

¿ÉÒÔÔÚ³ÌÐòÖÐÌí¼ÓÉÏÃæÁ½ÐдúÂ룬¡£È»ºó½«BankÐÞ¸ÄΪ£º


class Bank{

public Bank(){

}

public void deposit(int money){

lock.lock();

try{

account += money;

}finally{

lock.unlock();

}

}

public int getAccount(){

return account;

}

private final Lock lock = new ReentrantLock();

private int account = 100;

}

ÕâÑùÒ²¿ÉÒÔ½â¾ö·Çͬ²½ÎÊÌâ¡£ÖÁÓÚÕâ¸öÀ࣬´ó¼Ò¿ÉÒÔ×ÔÐÐÈ¥²é¿´API£¬ÎÒÖ»ÊÇÔÚÕâÀïÌáÐÑһϣ¬Èç¹ûsynchronizedÄܹ»Âú×ãÐèÇóµÄ»°£¬¾ÍʹÓÃsynchronized¹Ø¼ü×Ö£¬ÒòΪÕâ¸ö¿ÉÒÔ¼ò»¯´úÂ룬Èç¹ûÐèÒª¸ü¼Ó¸ß¼¶µÄ¹¦ÄܵÄʱºò£¬¾ÍʹÓÃLock¶ÔÏó£¬ÔÚʹÓÃReentrantLockµÄʱºò£¬Ò»¶¨Òª×¢Ò⼰ʱÊÍ·ÅËø£¬·ñÔò³ÌÐò»á³öÏÖËÀËø¡£

ʹÓÃÏֲ߳̾¿±äÁ¿ÊµÏÖÏß³Ìͬ²½

Õâ¸öÀý×ÓÑÝʾµÄÊÇÁ½¸öÏß³ÌͬʱÐÞ¸ÄÒ»¸ö±äÁ¿£¬ÔËÐнá¹û£º

¿ÉÒÔ·¢ÏÖ£¬Ã¿¸öÏß³ÌÍê³ÉÐÞ¸ÄÖ®ºóµÄ¸±±¾ÊÇÍêÈ«¶ÀÁ¢µÄ£¬Èç¹ûʹÓÃTreadLocalÀ´¹ÜÀí±äÁ¿£¬Ôòÿ¸öʹÓÃÕâ¸ö±äÁ¿µÄÏ̶߳¼»á»ñµÃÕâ¸ö±äÁ¿µÄÒ»¸ö¸±±¾¡££¬²¢ÇÒ¿ÉÒÔËæÒâÐÞ¸ÄÕâ¸ö¸±±¾£¬Ã¿¸öÏß³ÌÖ®¼ä²»»áÓ°Ïì¡£

TreadLocalºÍͬ²½»úÖÆ¶¼ÊÇΪÁ˽â¾ö¶àÏß³ÌÖеÄÏàͬ±äÁ¿·ÃÎʳåÍ»µÄÎÊÌâµÄ£¬Ç°Õß²ÉÓõÄÊǿռ仹ʱ¼ä£¬ºóÕß²ÉÓõÄÊÇʱ¼ä»»¿Õ¼ä

´úÂëÈçÏ£º


class Bank{

public Bank(){

}

public void deposit(int money){

account.set(account.get() + money);

}

public int getAccount(){

return account.get();

}

private static ThreadLocal<Integer> account = new ThreadLocal<Integer>(){

@Override

protected Integer initialValue(){

return 100;

}

};

}

Ïß³ÌÖ®¼äµÄͨÐÅ

»¹¼ÇµÃÎÒÔÚÎҵıʼÇjava IO×ܽáÖиø³öÁËÒ»¸öʹÓùܵÀÁ÷½øÐÐÏß³ÌÖ®¼äͨÐŵÄÀý×Ó£º


package Thread;

import java.io.IOException;

import java.io.PipedInputStream;

import java.io.PipedOutputStream;

/**

* ʹÓùܵÀÁ÷½øÐÐÏß³ÌÖ®¼äµÄͨÐÅ

* */

public class PipedTreadDemo{

public static void main(String[] args){

Sender send = new Sender();

Reciver rec = new Reciver();

try{

send.getOut().connect(rec.getReciver());

}catch(Exception e){

e.printStackTrace();

}

new Thread(send).start();

new Thread(rec).start();

}

}

/**

* ÏûÏ¢·¢ËÍÀà

* */

class Sender implements Runnable{

private PipedOutputStream out = null;

public Sender(){

out = new PipedOutputStream();

}

public PipedOutputStream getOut(){

return this.out;

}

@Override

public void run(){

String str = "rollen holt";

try{

out.write(str.getBytes());

}catch(IOException e){

e.printStackTrace();

}

try{

out.close();

}catch(IOException e){

e.printStackTrace();

}

}

}

/**

* ÏûÏ¢½ÓÊÜÀà

* */

class Reciver implements Runnable{

private PipedInputStream input = null;

public Reciver(){

input = new PipedInputStream();

}

public PipedInputStream getReciver(){

return this.input;

}

@Override

public void run(){

byte[] bytes = new byte[1024];

int len = 0;

try{

len = input.read(bytes);

}catch(IOException e){

e.printStackTrace();

}

try{

input.close();

}catch(IOException e){

e.printStackTrace();

}

System.out.println("¶ÁÈ¡µÄÄÚÈÝΪ£º" + new String(bytes, 0, len));

}

}

¡¾ÔËÐнá¹û¡¿£º

¶ÁÈ¡µÄÄÚÈÝΪ£ºrollen holt

ÏÂÃæ£¬ÎÒÃÇÔÚͬ²½µÄǰÌáÏ£¬ÔÚ¾Ù³öÒ»¸öÏß³ÌͨÐŵÄÀý×Ó£º

Ê×ÏȰڳöÔËÐнá¹ûÔÙ˵£º

³ÌÐò´úÂëÈçÏ£º


package Thread;

/**

* Ïß³ÌÖ®¼äµÄͨÐÅ

* */

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

public class TreadCommunicate extends JFrame{

public TreadCommunicate(){

panel.setLayout(new GridLayout(2, 2, 3, 3));

panel.add(label1);

panel.add(label2);

JScrollPane js1 = new JScrollPane(oneArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js1);

JScrollPane js2 = new JScrollPane(twoArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js2);

statrButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e){

Sender sender = new Sender();

Thread demo1 = new Thread(sender);

Thread demo2 = new Thread(new Receiver(sender));

demo1.start();

demo2.start();

}

});

panel2.add(panel);

panel2.add(statrButton);

setContentPane(panel2);

setSize(300, 400);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args){

new TreadCommunicate();

}

/**

* Âô¼Ò

* */

class Sender implements Runnable{

@Override

public void run(){

for(int i = 0; i < 5; ++i){

// Èç¹ûÒѾ­·¢ËÍ£¬ÄÇô¾ÍµÈ´ý

while(isValid){

Thread.yield();

}

product = products[i];

String text = oneArea.getText();

oneArea.setText(text + "·¢ËÍ" + product + "\n");

try{

Thread.sleep(1000);

}catch(Exception e){

e.printStackTrace();

}

isValid = true;

}

}

public boolean isisValid(){

return this.isValid;

}

public void setValid(boolean flag){

this.isValid = flag;

}

public String getProduct(){

return product;

}

private volatile String[] products = { "¡¶½ð ƿ÷¡·", "¡¶ºìÂ¥ÃΡ·", "¡¶Æ½·²µÄÊÀ½ç¡·",

"¡¶Á÷Ã¥ÀÏʦ¡·", "¡¶Î÷Óμǡ·" };

private volatile boolean isValid = false;

private volatile String product;

}// end sender

/**

* Âò¼Ò

* */

class Receiver implements Runnable{

public Receiver(){

}

public Receiver(Sender sender){

this.sender = sender;

}

@Override

public void run(){

for(int i = 0; i < 5; ++i){

// Èç¹ûûÓз¢ËÍ£¬¾ÍµÈ´ý

while(!sender.isisValid()){

Thread.yield();

}

String test = twoArea.getText();

twoArea.setText(test + "½ÓÊܵ½" + sender.getProduct() + "\n");

try{

Thread.sleep(1000);

}catch(Exception e){

e.printStackTrace();

}

sender.setValid(false);

}

}

private Sender sender;

}

JPanel panel = new JPanel();

JPanel panel2 = new JPanel();

private final JButton statrButton = new JButton("¿ªÊ¼½»Ò×");

private final JLabel label1 = new JLabel("Âô¼Ò");

private final JLabel label2 = new JLabel("Âò¼Ò");

private final JTextArea oneArea = new JTextArea(5, 10);

private final JTextArea twoArea = new JTextArea(5, 10);

}

ËÀËøµÄ·¶Àý

ÏÂÃæ¾ø¶Ô²»ÊDZ¾È˵°ÌÛµÄд³öÕâ¸öÒ»¸ö¸ü¼Ó½ÐÈ˵°Ì۵ijÌÐò¡£Ö»ÊǸø³öÁËÒ»¸öÀý×Ó£º


/**

* ¼òµ¥µÄËÀËø

* */

public class DeadLockDemo implements Runnable{

@Override

public void run(){

// »ñµÃµ±Ç°Ï̵߳ÄÃû×Ö

String str = Thread.currentThread().getName();

System.out.println(str + ": flag= " + flag);

if(flag){

synchronized (obj1){

try{

Thread.sleep(1000);

}catch(Exception e){

e.printStackTrace();

}

System.out.println(str + "ÒѾ­½øÈëͬ²½¿ìobj1£¬×¼±¸½øÈëͬ²½¿ìobj2");

synchronized (obj2){

System.out.println(str + "ÒѾ­½øÈëͬ²½¿ìobj2");

}

}

}

if(!flag){

synchronized (obj2){

try{

Thread.sleep(1000);

}catch(Exception e){

e.printStackTrace();

}

System.out.println(str + "ÒѾ­½øÈëͬ²½¿ìobj2£¬×¼±¸½øÈëͬ²½¿ìobj1");

synchronized (obj1){

System.out.println(str + "ÒѾ­½øÈëͬ²½¿ìobj1");

}

}

}

}

public static void main(String[] args){

DeadLockDemo demo1 = new DeadLockDemo();

DeadLockDemo demo2 = new DeadLockDemo();

demo1.flag = true;

demo2.flag = false;

new Thread(demo1).start();

new Thread(demo2).start();

}

private boolean flag;

private final Object obj1 = new Object();

private final Object obj2 = new Object();

}

¡¾ÔËÐнá¹û¡¿

£¨ÎÒ³ÐÈÏÎÒ½ñÌìRP±¬·¢£¬ÎÒÔËÐÐÁË10´Î£¬»¹ÊÇû³öÏÖËÀËøÄÇÖÖÇé¿ö£¬µ«ÊÇÕâ¸ö³ÌÐòȷʵ¿ÉÒÔ²úÉúËÀËøµÄ£¬ÄÄλÔËÐÐÕâ¸ö³ÌÐò£¬ÒªÊDzúÉúÁËËÀËø£¬Â鷳˵һÏ£¬Ð»Ð»£©

ʹÓÃÏ̳߳ØÓÅ»¯¶àÏ̱߳à³Ì

Õâ¸öÀý×ÓʹÓõÄÊÇExecutorsÀ࣬¶ÁÕß×ÔÐв鿴API£¬ÒòΪҪ½â˵µÄ»°£¬¾ÍÌ«¶àÁË¡£

ÏÂÃæÕâ¸öÀý×Ó¸ø³öÁËʹÓÃÏ̳߳غͲ»Ê¹ÓÃÏ̳߳صÄÇé¿öϵÄЧÂʵÄÎÊÌâ¡£


package Thread;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* ʹÓÃÏ̳߳ØÓÅ»¯¶àÏ̱߳à³Ì

* */

public class ThreadPoolDemo{

public static void main(String[] args){

Runtime run = Runtime.getRuntime();

// ΪÁ˼õÉÙÎó²î

run.gc();

long currentTime = System.currentTimeMillis();

long freemonery = run.freeMemory();

for(int i = 0; i < 10000; ++i){

new Thread(new Temo()).start();

}

System.out.println("¶ÀÁ¢ÔËÐÐ10000¸öÏß³ÌÕ¼ÓÃÄÚ´æÎª£º"

+ (freemonery - run.freeMemory()));

System.out.println("¶ÀÁ¢ÔËÐÐ10000¸öÏß³ÌÕ¼ÓÃʱ¼äΪ£º"

+ (System.currentTimeMillis() - currentTime));

// ÏÂÃæÊ¹ÓÃÏ̳߳ØÀ´ÊÔÊÔ

run.gc();

freemonery = run.freeMemory();

currentTime = System.currentTimeMillis();

ExecutorService executorService = Executors.newFixedThreadPool(3);

for(int i = 0; i < 10000; ++i){

executorService.submit(new Temo());

}

System.out.println("ʹÓÃÏ̳߳ØÔËÐÐ10000¸öÏß³ÌÕ¼ÓÃÄÚ´æÎª£º"

+ (freemonery - run.freeMemory()));

System.out.println("ʹÓÃÏ̳߳ØÔËÐÐ10000¸öÏß³ÌÕ¼ÓÃʱ¼äΪ£º"

+ (System.currentTimeMillis() - currentTime));

}

}

class Temo implements Runnable{

@Override

public void run(){

count++;

}

private int count = 0;

}

¡¾ÔËÐнá¹û¡¿£º

¶ÀÁ¢ÔËÐÐ10000¸öÏß³ÌÕ¼ÓÃÄÚ´æÎª£º3490440

¶ÀÁ¢ÔËÐÐ10000¸öÏß³ÌÕ¼ÓÃʱ¼äΪ£º1808

ʹÓÃÏ̳߳ØÔËÐÐ10000¸öÏß³ÌÕ¼ÓÃÄÚ´æÎª£º1237424

ʹÓÃÏ̳߳ØÔËÐÐ10000¸öÏß³ÌÕ¼ÓÃʱ¼äΪ£º62

ʹÓÃÐźÅÁ¿ÊµÏÖÏß³Ìͬ²½

ÏÖÔÚÎÒÃǼÌÐø»Ø´ðÖ®Ç°ÒøÐдæ¿îµÄÎÊÌ⣬ÏàÐÅ´ó¼Ò»¹Ã»ÓÐÍü¼Ç£¬¹þ¹þ£¬ÕæÊDz»ºÃÒâ˼£¬±¾À´Ïß³Ìͬ²½ÕâÒ»¿éÓ¦¸ÃÕûÀíÔÚÒ»ÆðµÄ¡£

Ò»¸öÐźÅÁ¿ÓÐ3ÖвÙ×÷£¬¶øÇÒËûÃÇÈ«²¿¶¼ÊÇÔ­×ӵ쬳õʼ»¯£¬Ôö¼Ó£¬¼õÉÙ¡£Ôö¼Ó¿ÉÒÔΪһ¸ö½ø³Ì½â³ý×èÈû£¬¼õÉÙ¿ÉÒÔΪһ¸ö½ø³Ì½øÈë×èÈû

SemaphoreÀàÊÇÒ»¸ö¼¼ÊõÐźÅÁ¿£¬´Ó¸ÅÄîÉÏÐźÅÁ¿Î¬³ÖÁËÒ»¸öÐí¿É¼¯¡£

ÏÖÔÚÎÒÃǼÌÐø¿´ÉÏÃæµÄÒøÐдæ¿îÎÊÌ⣺


package Thread;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.concurrent.Semaphore;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

public class synDemo extends JFrame{

public synDemo(){

panel.setLayout(new GridLayout(2, 2, 3, 3));

panel.add(label1);

panel.add(label2);

JScrollPane js1 = new JScrollPane(oneArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js1);

JScrollPane js2 = new JScrollPane(twoArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js2);

panel2.add(panel);

panel2.add(statrButton);

setContentPane(panel2);

statrButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e){

Thread demo1 = new Thread(new Transfer1(bank, oneArea,

semaphore));

demo1.start();

Thread demo2 = new Thread(new Transfer1(bank, twoArea,

semaphore));

demo2.start();

}

});

setSize(300, 400);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args){

new synDemo();

}

Semaphore semaphore = new Semaphore(1, true);

private final Bank1 bank = new Bank1();

JPanel panel = new JPanel();

JPanel panel2 = new JPanel();

private final JButton statrButton = new JButton("¿ªÊ¼´æÇ®");

private final JLabel label1 = new JLabel("Ò»ºÅÏß³Ì");

private final JLabel label2 = new JLabel("¶þºÅÏß³Ì");

private final JTextArea oneArea = new JTextArea(5, 10);

private final JTextArea twoArea = new JTextArea(5, 10);

}

/**

* ±íÊ¾ÒøÐеÄÀà

* */

class Bank1{

public Bank1(){

}

public void deposit(int money){

account += money;

}

public int getAccount(){

return account;

}

private int account;

}

/**

* ±íʾÍùÕË»§´æÇ®

* */

class Transfer1 implements Runnable{

public Transfer1(){

}

public Transfer1(Bank1 bank, JTextArea textArea, Semaphore semaphore){

this.bank = bank;

this.textArea = textArea;

this.semaphore = semaphore;

}

@Override

public void run(){

for(int i = 0; i < 20; ++i){

// »ñµÃÐí¿É

try{

semaphore.acquire();

}catch(InterruptedException e){

e.printStackTrace();

}

bank.deposit(10);

String str = textArea.getText();

textArea.setText(str + "ÕË»§Óà¶îΪ£º" + bank.getAccount() + "\n");

// ÊÍ·ÅÐí¿É

semaphore.release();

}

}

// ×¢Òâ

private Semaphore semaphore;

private Bank1 bank = null;

private JTextArea textArea = null;

}

ÔËÐнá¹û£º

ʹÓÃÔ­×Ó±äÁ¿ÊµÏÖÏß³Ìͬ²½


package Thread;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.concurrent.atomic.AtomicInteger;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

public class synDemo extends JFrame{

public synDemo(){

panel.setLayout(new GridLayout(2, 2, 3, 3));

panel.add(label1);

panel.add(label2);

JScrollPane js1 = new JScrollPane(oneArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js1);

JScrollPane js2 = new JScrollPane(twoArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

panel.add(js2);

panel2.add(panel);

panel2.add(statrButton);

setContentPane(panel2);

statrButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e){

Thread demo1 = new Thread(new Transfer1(bank, oneArea));

demo1.start();

Thread demo2 = new Thread(new Transfer1(bank, twoArea));

demo2.start();

}

});

setSize(300, 400);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args){

new synDemo();

}

private final Bank1 bank = new Bank1();

JPanel panel = new JPanel();

JPanel panel2 = new JPanel();

private final JButton statrButton = new JButton("¿ªÊ¼´æÇ®");

private final JLabel label1 = new JLabel("Ò»ºÅÏß³Ì");

private final JLabel label2 = new JLabel("¶þºÅÏß³Ì");

private final JTextArea oneArea = new JTextArea(5, 10);

private final JTextArea twoArea = new JTextArea(5, 10);

}

/**

* ±íÊ¾ÒøÐеÄÀà

* */

class Bank1{

public Bank1(){

}

public void deposit(int money){

account.addAndGet(money);

}

public int getAccount(){

return account.get();

}

//×¢Òâ

private final AtomicInteger account = new AtomicInteger(100);

}

/**

* ±íʾÍùÕË»§´æÇ®

* */

class Transfer1 implements Runnable{

public Transfer1(){

}

public Transfer1(Bank1 bank, JTextArea textArea){

this.bank = bank;

this.textArea = textArea;

}

@Override

public void run(){

for(int i = 0; i < 20; ++i){

bank.deposit(10);

String str = textArea.getText();

textArea.setText(str + "ÕË»§Óà¶îΪ£º" + bank.getAccount() + "\n");

}

}

private Bank1 bank = null;

private JTextArea textArea = null;

}

¡¾ÔËÐнá¹û¡¿£º

   
1951 ´Îä¯ÀÀ       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¼°ÆäÇ°ÑØ¼¼Êõ