½ø³ÌÓëÏß³Ì
½ø³ÌÊdzÌÐòÔÚ´¦Àí»úÖеÄÒ»´ÎÔËÐС£Ò»¸ö½ø³Ì¼È°üÀ¨ÆäËùÒªÖ´ÐеÄÖ¸ÁҲ°üÀ¨ÁËÖ´ÐÐÖ¸ÁîËùÐèµÄϵͳ×ÊÔ´£¬²»Í¬½ø³ÌËùÕ¼ÓõÄϵͳ×ÊÔ´Ïà¶Ô¶ÀÁ¢¡£ËùÒÔ½ø³ÌÊÇÖØÁ¿¼¶µÄÈÎÎñ£¬ËüÃÇÖ®¼äµÄͨÐźÍת»»¶¼ÐèÒª²Ù×÷ϵͳ¸¶³ö½Ï´óµÄ¿ªÏú¡£
Ïß³ÌÊǽø³ÌÖеÄÒ»¸öʵÌ壬ÊDZ»ÏµÍ³¶ÀÁ¢µ÷¶ÈºÍ·ÖÅɵĻù±¾µ¥Î»¡£Ïß³Ì×Ô¼º»ù±¾Éϲ»ÓµÓÐϵͳ×ÊÔ´£¬µ«Ëü¿ÉÒÔÓëͬÊôÒ»¸ö½ø³ÌµÄÆäËûÏ̹߳²Ïí½ø³ÌËùÓµÓеÄÈ«²¿×ÊÔ´¡£ËùÒÔÏß³ÌÊÇÇáÁ¿¼¶µÄÈÎÎñ£¬ËüÃÇÖ®¼äµÄͨÐźÍת»»Ö»ÐèÒª½ÏСµÄϵͳ¿ªÏú¡£
JavaÖ§³Ö¶àÏ̱߳à³Ì£¬Òò´ËÓÃJava±àдµÄÓ¦ÓóÌÐò¿ÉÒÔͬʱִÐжà¸öÈÎÎñ¡£JavaµÄ¶àÏ̻߳úÖÆÊ¹ÓÃÆðÀ´·Ç³£·½±ã£¬Óû§Ö»Ðè¹Ø×¢³ÌÐòϸ½ÚµÄʵÏÖ£¬¶ø²»Óõ£Ðĺǫ́µÄ¶àÈÎÎñϵͳ¡£
JavaÓïÑÔÀÏ̱߳íÏÖΪÏß³ÌÀà¡£ThreadÏß³ÌÀà·â×°ÁËËùÓÐÐèÒªµÄÏ̲߳Ù×÷¿ØÖÆ¡£ÔÚÉè¼Æ³ÌÐòʱ£¬±ØÐëºÜÇåÎúµØÇø·Ö¿ªÏ̶߳ÔÏóºÍÔËÐÐỊ̈߳¬¿ÉÒÔ½«Ï̶߳ÔÏó¿´×÷ÊÇÔËÐÐÏ̵߳ĿØÖÆÃæ°å¡£ÔÚÏ̶߳ÔÏóÀïÓкܶ෽·¨À´¿ØÖÆÒ»¸öÏß³ÌÊÇ·ñÔËÐУ¬Ë¯Ãߣ¬¹ÒÆð»òÍ£Ö¹¡£Ïß³ÌÀàÊÇ¿ØÖÆÏß³ÌÐÐΪµÄΨһµÄÊֶΡ£Ò»µ©Ò»¸öJava³ÌÐòÆô¶¯ºó£¬¾ÍÒѾÓÐÒ»¸öÏß³ÌÔÚÔËÐС£¿Éͨ¹ýµ÷ÓÃThread.currentThread·½·¨À´²é¿´µ±Ç°ÔËÐеÄÊÇÄÄÒ»¸öÏ̡߳£
Ï̴߳´½¨µÄÁ½ÖÖ·½·¨
JAVAÖд´½¨Ï߳̿ÉÒÔͨ¹ý¼Ì³ÐThreadÀàºÍʵÏÖRunnable½Ó¿ÚÀ´´´½¨Ò»¸öÏ̡߳£Runnable·½Ê½¿ÉÒÔ±ÜÃâThread
·½Ê½ÓÉÓÚJAVAµ¥¼Ì³ÐÌØÐÔ´øÀ´µÄȱÏÝ¡£RunnableµÄ´úÂë¿ÉÒÔ±»¶à¸öÏß³Ì(ThreadʵÀý)¹²Ïí£¬ÊʺÏÓÚ¶à¸öÏ̴߳¦Àíͬһ×ÊÔ´µÄÇé¿ö¡£
¼Ì³ÐThreadÀà
class MyThread extends Thread{ ..... @Override public void run(){
}
}
MyThread mt=new MyThread();
mt.start(); |
ʵÏÖRunnable½Ó¿Ú
class MyThread implements Runnable{ .... @Override public void run(){
}
}
MyThread mt=new MyThread();
Thread td=new Thread(mt);
sd.start(); |
Thread&Runnable·Ö±ðÄ£ÄâÂô»ð³µÆ±
Thread·½Ê½
class MyThread extends Thread { private int ticketsCont=5; //Ò»¹²ÓÐ5ÕÅ»ð³µÆ±
private String name; //´°¿Ú, Ò²¼´ÊÇÏ̵߳ÄÃû×Ö
public MyThread(String name){
this.name=name;
}
@Override
public void run(){
while(ticketsCont>0){
ticketsCont--; //Èç¹û»¹ÓÐÆ±£¬¾ÍÂôµôÒ»ÕÅÆ±
System.out.println(name+"ÂôµôÁË1ÕÅÆ±£¬Ê£ÓàÆ±ÊýΪ:"+ticketsCont);
}
}
}
public class TicketsThread
{
public static void main(String args[]){
//´´½¨Èý¸öỊ̈߳¬Ä£ÄâÈý¸ö´°¿ÚÂôƱ
MyThread mt1=new MyThread("´°¿Ú1");
MyThread mt2=new MyThread("´°¿Ú2");
MyThread mt3=new MyThread("´°¿Ú3");
//Æô¶¯Èý¸öỊ̈߳¬Ò²¼´ÊÇ´°¿Ú£¬¿ªÊ¼ÂôƱ
mt1.start();
mt2.start();
mt3.start();
}
} |
Runnable·½Ê½
class MyThread2 implements Runnable { private int ticketsCont=1000; //Ò»¹²ÓÐ5ÕÅ»ð³µÆ± @Override public void run(){ while(true){ synchronized(this){ if(ticketsCont<=0){ break; } ticketsCont--; //Èç¹û»¹ÓÐÆ±£¬¾ÍÂôµôÒ»ÕÅÆ± System.out.println(Thread.currentThread().getName()+" ÂôµôÁË1ÕÅÆ±£¬Ê£ÓàÆ±ÊýΪ:"+ticketsCont); /*try{ Thread.sleep(50); //ͨ¹ý×èÈû³ÌÐòÀ´²é¿´Ð§¹û } catch(Exception e){ System.out.println(e); }*/
}
}
}
/*@Override //²»¼Óͬ²½Ëø
public void run(){
while(ticketsCont>0){
ticketsCont--; //Èç¹û»¹ÓÐÆ±£¬¾ÍÂôµôÒ»ÕÅÆ±
System.out.println(Thread.currentThread().getName()+"ÂôµôÁË1ÕÅÆ±£¬Ê£ÓàÆ±ÊýΪ:"+ticketsCont);
}
}*/
}
public class TicketsRunnable
{
public static void main(String args[]){
MyThread2 mt=new MyThread2();
//´´½¨Èý¸öÏß³ÌÀ´Ä£ÄâÈý¸öÊÛÆ±´°¿Ú
Thread th1=new Thread(mt,"´°¿Ú1");
Thread th2=new Thread(mt,"´°¿Ú2");
Thread th3=new Thread(mt,"´°¿Ú3");
//Æô¶¯Èý¸öỊ̈߳¬Ò²¼´ÊÇÈý¸ö´°¿Ú£¬¿ªÊ¼ÂôƱ
th1.start();
th2.start();
th3.start();
}
} |
Ï̵߳ÄÉúÃüÖÜÆÚ

´´½¨:н¨Ò»¸öÏ̶߳ÔÏó,ÈçThread thd=new Thread()
¾ÍÐ÷:´´½¨ÁËÏ̶߳ÔÏóºó,µ÷ÓÃÁËÏ̵߳Ästart()·½·¨(´ËʱÏß³Ì֪ʶ½øÈëÁËÏ̶߳ÓÁÐ,µÈ´ý»ñÈ¡CPU·þÎñ
,¾ß±¸ÁËÔËÐеÄÌõ¼þ,µ«²¢²»Ò»¶¨ÒѾ¿ªÊ¼ÔËÐÐÁË)
ÔËÐÐ:´¦ÓÚ¾ÍÐ÷״̬µÄÏß³Ì,Ò»µ©»ñÈ¡ÁËCPU×ÊÔ´£¬±ã½øÈëµ½ÔËÐÐ״̬£¬¿ªÊ¼Ö´ÐÐrun()·½·¨ÀïÃæµÄÂß¼
ÖÕÖ¹:Ï̵߳Ärun()·½·¨Ö´ÐÐÍê±Ï£¬»òÕßÏ̵߳÷ÓÃÁËstop()·½·¨,Ïß³Ì±ã½øÈëÖÕֹ״̬
×èÈû:Ò»¸öÕýÔÚÖ´ÐеÄÏß³ÌÔÚijЩÇé¿öϵ£¬ÓÉÓÚijÖÖÔÒò¶øÔÝʱÈóöÁËCPU×ÊÔ´£¬ÔÝÍ£ÁË×Ô¼ºµÄÖ´ÐУ¬±ã½øÈëÁË×èÈû״̬£¬Èçµ÷ÓÃÁËsleep()·½·¨
Ï̵߳ķÖÀà
Óû§Ïß³Ì:ÔËÐÐÔÚǰ̨£¬Ö´ÐоßÓеÄÈÎÎñ³ÌÐòµÄÖ÷Ị̈߳¬Á¬½ÓÍøÂçµÄ×ÓÏ̵߳ȶ¼ÊÇÓû§Ïß³Ì
ÊØ»¤Ïß³Ì:ÔËÐÐÔÚºóÍ·£¬ÎªÆäËûǰ̨Ï̷߳þÎñ¡£Ò»µ©ËùÓÐÓû§Ï̶߳¼½áÊøÔËÐУ¬ÊØ»¤Ï̻߳áËæJVMÒ»Æð½áÊø¹¤×÷¡£¿ÉÒÔͨ¹ýµ÷ÓÃThreadÀàµÄsetDaemon(true)·½·¨À´ÉèÖõ±Ç°µÄÏß³ÌÎªÊØ»¤Ị̈߳¬¸Ã·½·¨±ØÐëÔÚstart()·½·¨Ö®Ç°µ÷Ó㬷ñÔò»áÅ׳ö
IllegalThreadStateExceptionÒì³£¡£ÔÚÊØ»¤Ïß³ÌÖвúÉúµÄÐÂÏß³ÌÒ²ÊÇÊØ»¤Ï̡߳£²»ÊÇËùÓеÄÈÎÎñ¶¼¿ÉÒÔ·ÖÅä¸øÊØ»¤Ïß³ÌÀ´Ö´ÐУ¬±ÈÈç¶Áд²Ù×÷»òÕß¼ÆËãÂß¼¡£
ÊØ»¤Ï̲߳âÊÔ°¸Àý

³¡¾°:Ò»¸öÖ÷Ị̈߳¬Ò»¸öÊØ»¤Ị̈߳¬ÊØ»¤Ï̻߳áÔںܳ¤Ò»¶Îʱ¼äÄÚÏò±¾µØÎļþÖÐдÈëÊý¾Ý£¬Ö÷Ï߳̽øÈë×èÈû״̬µÈ´ýÓû§µÄÊäÈ룬һµ©È·ÈÏÁËÓû§µÄÊäÈë×èÈû¾Í»á½â³ýµô£¬Ö÷Ï̼߳ÌÐøÔËÐÐÖ±µ½½áÊø£¬ÊØ»¤Ïß³ÌÒ²»áËæÐéÄâ»úһͬ½áÊø¡£
import java.io.*; import java.util.Scanner;
class Daemon implements Runnable
{
@Override
public void run(){
System.out.println("½øÈëÊØ»¤Ïß³Ì");
try{
writeToFile();
}
catch(Exception e){
e.printStackTrace();
}
System.out.println("Í˳öÊØ»¤Ïß³Ì");
}
private void writeToFile() throws Exception{
File filename=new File("F:/Ľ¿ÎÍø(imooc)/ϸ˵¶àÏß³ÌÖ®Thread
VS Runnable/daemon.txt");
OutputStream os=new FileOutputStream(filename,true);
int count=0;
while(count<999){
os.write(("\r\nword"+count).getBytes());
System.out.println("ÊØ»¤Ïß³Ì"+Thread.currentThread().getName()+"ÏòÎļþÖÐдÈëword"+count++);
Thread.sleep(1000);
}
}
}
public class DaemonThreadDemo
{
public static void main(String args[]){
System.out.println("½øÈëÖ÷Ïß³Ì"+Thread.currentThread().getName());
Daemon daemonThread=new Daemon();
Thread thread =new Thread(daemonThread);
thread.setDaemon(true);
thread.start();
Scanner sc=new Scanner(System.in);
sc.next();
System.out.println("Í˳öÖ÷Ïß³Ì"+Thread.currentThread().getName());
}
} |
²âÊÔ½á¹û

ʹÓÃjstackÉú³ÉÏ߳̿ìÕÕ
jstack¹¤¾ßµ½jdk°²×°Ä¿Â¼binÎļþ¼ÐÏ¡£jstackÄÜÉú³ÉJVMµ±Ç°Ê±¿ÌÏ̵߳ĿìÕÕ(threaddump,
¼´µ±Ç°½ø³ÌÖÐËùÓÐÏ̵߳ÄÐÅÏ¢)¡£°ïÖú¶¨Î»³ÌÐòÎÊÌâ³öÏÖµÄÔÒò£¬È糤ʱ¼äÍ£¶Ù¡¢CPUÕ¼ÓÃÂʹý¸ßµÈ¡£
ʹÓ÷½·¨
jstack [-l] <pid> : [-l]¿ÉÓпÉÎÞ£¬±íʾ¹ØÓÚËøµÄ¶þλÐÅÏ¢;<pid>±íʾ½ø³ÌID¡£

×ܽá
½¨ÒéʹÓÃRunnableÕâÖÖ·½Ê½´´½¨Ï̡߳£ ³ÌÐòÖеÄͬһ×ÊÔ´Ö¸µÄÊÇͬһ¸öRunnable¶ÔÏó¡£°²È«µÄÂôƱ³ÌÐòÖÐÐèÒª¼ÓÈëͬ²½synchronized¡£ |