Ïß³ÌÒ»°ãÓÐ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;
} |
¡¾ÔËÐнá¹û¡¿£º

|