欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
多線(xiàn)程/JAVA多線(xiàn)程 - 魔樂(lè )培訓 高端JAVA培訓 魔樂(lè )科技JAVA培訓

多線(xiàn)程

 發(fā)布日期:2008-10-30 8:57:00 發(fā)布者:[IT電子教育門(mén)戶(hù)]   評論:[ 8]  瀏覽: 850

1、課程名稱(chēng):多線(xiàn)程
 多線(xiàn)程的基本作用、兩種實(shí)現的區別、同步與死鎖的概念。
 在開(kāi)發(fā)中真正去編寫(xiě)多線(xiàn)程代碼是很少的,要的只是基本概念,本章就是基本概念。
2、知識點(diǎn)
2.1、上次課程的主要知識點(diǎn)
 1、 包的定義及使用
 2、 四種訪(fǎng)問(wèn)控制權限
2.2、本次預計講解的知識點(diǎn)
 1、 多線(xiàn)程的概念
 2、 多線(xiàn)程的兩種實(shí)現方式及區別
 3、 多線(xiàn)程的主要操作方法
 4、 同步與死鎖的概念
3、具體內容
3.1、多線(xiàn)程的基本概念
 JAVA是少數幾個(gè)支持多線(xiàn)程的語(yǔ)言,所以多線(xiàn)程也就是成為了JAVA的一個(gè)特點(diǎn)。
 最早的DOS系統一旦有病毒進(jìn)入,則立刻死機,因為在同一個(gè)時(shí)間段上,永遠只能有一個(gè)進(jìn)程執行。
 而windows就算是有病毒產(chǎn)生了,則系統照樣可以執行。因為是屬于多進(jìn)程的操作系統。
 進(jìn)程:每一個(gè)應用程序的啟動(dòng)就稱(chēng)為進(jìn)程。
 線(xiàn)程:是在進(jìn)程的基礎之上劃分出來(lái)的比進(jìn)程更小的時(shí)間單位。
 線(xiàn)程的運行速度要超過(guò)進(jìn)程。
 一個(gè)操作系統雖然可以跑多個(gè)進(jìn)程,但是對于整個(gè)電腦而言只有一個(gè)CPU,所以在同一個(gè)時(shí)間段上CPU會(huì )處理多個(gè)程序,而在同一個(gè)時(shí)間點(diǎn)上CPU只會(huì )處理一個(gè)程序。
3.2、線(xiàn)程的實(shí)現
 在JAVA中要想實(shí)現一個(gè)多線(xiàn)程的程序有兩種方式:
  • 繼承Thread類(lèi)
  • 實(shí)現Runnable接口
3.2.1、繼承Thread類(lèi)實(shí)現
 一個(gè)類(lèi)只要繼承了Thread類(lèi),那么此類(lèi)就稱(chēng)為多線(xiàn)程的操作類(lèi)。
例如:以下代碼
class MyThread extends Thread{
};
 線(xiàn)程在操作之中應該存在線(xiàn)程的主體,線(xiàn)程的主體方法為:run方法,所以Thread的子類(lèi)必須覆寫(xiě)run方法。
例如:以下代碼覆寫(xiě)了run方法
class MyThread extends Thread{
 private String name ;
 public MyThread(String name){
  this.name = name ;
 }
 public void run(){
  for(int i=0;i<100;i++){
   System.out.println(name + "運行,i = " + i) ;
  }
 }
};
public class ThreadDemo01{
 public static void main(String args[]){
  MyThread mt1 = new MyThread("線(xiàn)程A ") ;
  MyThread mt2 = new MyThread("線(xiàn)程B ") ;
  mt1.run() ;
  mt2.run() ;
 }
};
 編譯并運行程序,觀(guān)察效果。從運行結果可以發(fā)現,是A執行完之后再執行B,但是之前的程序并沒(méi)有同時(shí)運行,因為此時(shí),線(xiàn)程并沒(méi)有啟動(dòng),如果要想啟動(dòng)線(xiàn)程則必須調用Thread類(lèi)中的start()方法才可以。例如:修改之前的代碼:
class MyThread extends Thread{
 private String name ;
 public MyThread(String name){
  this.name = name ;
 }
 public void run(){
  for(int i=0;i<100;i++){
   System.out.println(name + "運行,i = " + i) ;
  }
 }
};
public class ThreadDemo02{
 public static void main(String args[]){
  MyThread mt1 = new MyThread("線(xiàn)程A ") ;
  MyThread mt2 = new MyThread("線(xiàn)程B ") ;
  mt1.start() ;
  mt2.start() ;
 }
};
 發(fā)現此時(shí)的運行結果是,兩個(gè)線(xiàn)程之間交替執行。
問(wèn)題?
 既然start()方法調用的還是run方法,那為什么不直接調用run方法呢?
 觀(guān)察JDK中的Thread類(lèi)實(shí)現
start()方法的定義:
    public synchronized void start() {
        if (started)
            throw new IllegalThreadStateException();
        started = true;
        start0();
    }
    private native void start0();
 如果一個(gè)線(xiàn)程已經(jīng)啟動(dòng)了之后再啟動(dòng)第二次,則會(huì )報非法的線(xiàn)程狀態(tài)。
 在JAVA中有一種技術(shù)稱(chēng)為:JNI技術(shù),表示的是JAVA本地接口,可以通過(guò)JAVA調用本地操作系統中的函數支持。所以線(xiàn)程的實(shí)現靠的是操作系統的支持。
 如果一個(gè)多線(xiàn)程的操作,使用了Thread類(lèi)來(lái)完成的話(huà),那么此類(lèi)就不能繼承其他的類(lèi)了。
3.2.2、實(shí)現Runnable接口
 實(shí)現Rrnnable接口同時(shí)覆寫(xiě)run方法
class MyThread implements Runnable{
 private String name ;
 public MyThread(String name){
  this.name = name ;
 }
 public void run(){
  for(int i=0;i<100;i++){
   System.out.println(name + "運行,i = " + i) ;
  }
 }
};
 但是Runnable接口與Thread類(lèi)不同的是,Runnable接口中并沒(méi)有關(guān)于start()方法的定義,而只有Thread類(lèi)中才有。繼續觀(guān)察Thread類(lèi)。
 觀(guān)察Thread類(lèi)中有如下兩個(gè)構造方法:
  • public Thread(Runnable target)
• public Thread(Runnable target,String name)
例如:使用以上的操作啟動(dòng)多線(xiàn)程
class MyThread implements Runnable{
 private String name ;
 public MyThread(String name){
  this.name = name ;
 }
 public void run(){
  for(int i=0;i<100;i++){
   System.out.println(name + "運行,i = " + i) ;
  }
 }
};
public class ThreadDemo03{
 public static void main(String args[]){
  MyThread mt1 = new MyThread("線(xiàn)程A ") ;
  MyThread mt2 = new MyThread("線(xiàn)程B ") ;
  new Thread(new MyThread("線(xiàn)程A")).start() ;
  new Thread(new MyThread("線(xiàn)程B")).start() ;
 }
};
3.2.3、Thread類(lèi)與Runnable接口的關(guān)系
 1、 Thread也是Runnable接口的子類(lèi)
  • public class Thread extends Object implements Runnable
 2、 Thread類(lèi)中有單繼承的局限,而Runnable中并沒(méi)有此局限
 3、 使用Runnable實(shí)現的多線(xiàn)程操作類(lèi),適合于多個(gè)線(xiàn)程對象共享數據
例如:驗證資源的共享
A、 使用Thread類(lèi)完成
class MyThread extends Thread{
 private int ticket = 10 ;
 public void run(){
  for(int i=0;i<100;i++){
   if(ticket>0){
    System.out.println("賣(mài)票。ticket = " + ticket--) ;
   }
  }
 }
};
public class ThreadDemo04{
 public static void main(String args[]){
  MyThread mt1 = new MyThread() ;
  MyThread mt2 = new MyThread() ;
  MyThread mt3 = new MyThread() ;
  mt1.start() ;
  mt2.start() ;
  mt3.start() ;
 }
};
 整個(gè)程序一共賣(mài)出了30張票,但是實(shí)際上只有10張票,這是因為每一個(gè)線(xiàn)程對象都擁有各自的10張票。而如果現在使用Runnable接口實(shí)現的話(huà),則可以達到資源的共享
B、 使用Runnable接口實(shí)現
class MyThread implements Runnable{
 private int ticket = 10 ;
 public void run(){
  for(int i=0;i<100;i++){
   if(ticket>0){
    System.out.println("賣(mài)票。ticket = " + ticket--) ;
   }
  }
 }
};
public class ThreadDemo05{
 public static void main(String args[]){
  MyThread mt = new MyThread() ;
  new Thread(mt).start() ;
  new Thread(mt).start() ;
  new Thread(mt).start() ;
 }
};
3.3、線(xiàn)程的狀態(tài)
 
 所有的線(xiàn)程雖然在語(yǔ)句上有先有后,但是是同時(shí)啟動(dòng)的,誰(shuí)先搶占到CPU資源,誰(shuí)就運行。
 線(xiàn)程創(chuàng )建完成之后,等待啟動(dòng),啟動(dòng)之前先進(jìn)入到就緒狀態(tài)。之后等待CPU調度,調度之后進(jìn)入運行狀態(tài)。
 如果中間有問(wèn)題了,導致程序暫停執行,則進(jìn)入到阻塞狀態(tài)?;氐骄途w狀態(tài),等待再次執行。
 當全部程序執行完之后,就進(jìn)入到終止狀態(tài)了。
 所有的線(xiàn)程并不是一調用start()方法就立刻啟動(dòng),而是要等待CPU調度才可以執行。
3.4、線(xiàn)程的主要操作方法
 線(xiàn)程中的所有操作方法都是在Thread類(lèi)中定義的。
3.4.1、取得當前正在運行的線(xiàn)程名稱(chēng)
 在Thread類(lèi)中有以下一個(gè)方法可以取得當前正在運行的線(xiàn)程對象。
  • public static Thread currentThread()
 Thread類(lèi)的構造方法:
  • public Thread(Runnable target,String name)
• public Thread(String name)
 取得線(xiàn)程的名稱(chēng):public final String getName()
 設置線(xiàn)程的名稱(chēng):public final void setName(String name)
 可以通過(guò)Thread類(lèi)中的setName()方法設置一個(gè)線(xiàn)程的名稱(chēng),但是最好在線(xiàn)程啟動(dòng)之前進(jìn)行設置。
例如:以下代碼取得了當前正在運行的線(xiàn)程名稱(chēng)
class MyThread implements Runnable{
 public void run(){
  for(int i=0;i<10;i++){
    System.out.println(Thread.currentThread().getName() + "運行, i = " + i) ;
  }
 }
};
public class ThreadDemo06{
 public static void main(String args[]){
  MyThread mt = new MyThread() ;
  new Thread(mt).start() ;
  new Thread(mt).start() ;
  new Thread(mt).start() ;
 }
};
 發(fā)現此時(shí)線(xiàn)程的名稱(chēng)很有規律:Thread-0、Thread-1、Thread-2,…
 里面肯定有一個(gè)static的屬性,用于保存當前產(chǎn)生了多少個(gè)對象。
例如:直接為線(xiàn)程命名
class MyThread implements Runnable{
 public void run(){
  for(int i=0;i<10;i++){
    System.out.println(Thread.currentThread().getName() + "運行, i = " + i) ;
  }
 }
};
public class ThreadDemo07{
 public static void main(String args[]){
  MyThread mt = new MyThread() ;
  new Thread(mt,"線(xiàn)程A").start() ;
  new Thread(mt,"線(xiàn)程B").start() ;
  new Thread(mt,"線(xiàn)程C").start() ;
  new Thread(mt).start() ;
  new Thread(mt).start() ;
 }
};
分析以下程序的執行結果:
class MyThread implements Runnable{
 public void run(){
  for(int i=0;i<10;i++){
    System.out.println(Thread.currentThread().getName() + "運行, i = " + i) ;
  }
 }
};
public class ThreadDemo08{
 public static void main(String args[]){
  MyThread mt = new MyThread() ;
  new Thread(mt,"線(xiàn)程").start() ;
  mt.run() ;  ? 主方法直接調用的run()方法
 }
};
 觀(guān)察輸出結果:
  • 發(fā)現有一個(gè)main線(xiàn)程的存在。
 一個(gè)JAVA程序至少啟動(dòng)幾個(gè)線(xiàn)程?是兩個(gè)
  • MAIN:主線(xiàn)程
  • 垃圾收集線(xiàn)程
3.4.2、線(xiàn)程的休眠
 對于線(xiàn)程可以允許其稍微暫停運行,使用休眠的語(yǔ)法即可完成,方法定義如下:
  • public static void sleep(long millis) throws InterruptedException
  • 此方法會(huì )拋出中斷異常
例如:以下程序驗證了sleep()方法的使用
class MyThread implements Runnable{
 public void run(){
  for(int i=0;i<10;i++){
   try{
    Thread.sleep(500) ;
   }catch(Exception e){}
   System.out.println(Thread.currentThread().getName() + "運行, i = " + i) ;
  }
 }
};
public class ThreadDemo09{
 public static void main(String args[]){
  MyThread mt = new MyThread() ;
  new Thread(mt,"線(xiàn)程").start() ;
  mt.run() ;
 }
};
3.4.3、線(xiàn)程的中斷
 之前休眠方法上有一個(gè)中斷的異常拋出,實(shí)際上線(xiàn)程是可以中斷的。
 如果要想中斷一個(gè)線(xiàn)程則必須使用另外一個(gè)線(xiàn)程控制,中斷線(xiàn)程的方法:
  • public void interrupt()
例如:以下代碼演示了中斷線(xiàn)程的操作
class MyThread implements Runnable{
 public void run(){
  System.out.println("********* 進(jìn)入run方法 **********") ;
  try{
   System.out.println(" =========== 開(kāi)始休眠 ===============") ;
   Thread.sleep(20000) ; 
   System.out.println(" =========== 結束休眠 ===============") ;
  }catch(Exception e){
   System.out.println(e) ;
   // 表示直接返回到方法的調用處
   return ;
  }
  System.out.println("********* 完成run方法 **********") ;
 }
};
public class ThreadDemo10{
 public static void main(String args[]){
  MyThread mt = new MyThread() ;
  Thread t = new Thread(mt,"線(xiàn)程") ;
  t.start() ;
  try{
   // 為了可以讓程序多休眠一會(huì )兒
   Thread.sleep(1000) ; 
  }catch(Exception e){
  }
  // 中斷線(xiàn)程執行
  t.interrupt() ;
 }
};
3.4.4、線(xiàn)程的強制執行
 可以使用一個(gè)方法讓一個(gè)線(xiàn)程強制的執行下去。方法的定義為:
  • public final void join() throws InterruptedException
例如:以下代碼演示了join的作用
class MyThread implements Runnable{
 public void run(){
  int i = 0 ;
  while(true){
   System.out.println(Thread.currentThread().getName() + " --> i = " + i++) ;
  }
 }
};
public class ThreadDemo11{
 public static void main(String args[]){
  Thread t = new Thread(new MyThread(),"==線(xiàn)程==") ;
  int i = 0 ;
  t.start() ;
  while(true){
   if(i>=100){
    // 強制運行
    try{
     t.join() ;
    }catch(Exception e){}
   }
   System.out.println("MAIN " + i++) ;
  }
 }
};
3.5、線(xiàn)程的同步與死鎖

4、總結
1、 線(xiàn)程可以不掌握代碼,但是所有的概念必須非常清楚
2、 進(jìn)程與線(xiàn)程的區別
 • 線(xiàn)程是在進(jìn)程的基礎之上的進(jìn)一步劃分
 • 如果沒(méi)有進(jìn)程了,則線(xiàn)程也不存在
3、 JAVA中線(xiàn)程實(shí)現的兩種方式
 • 繼承Thread類(lèi),不能共享數據
 • 實(shí)現Runnable接口,可以共享數據
 • 使用Runnable的最大好處是可以避免單繼承帶來(lái)的局限
4、 JAVA中一個(gè)java命令實(shí)際上啟動(dòng)的是一個(gè)JVM進(jìn)程,一個(gè)JVM進(jìn)程至少啟動(dòng)兩個(gè)線(xiàn)程:
 • MAIN線(xiàn)程
 • GC線(xiàn)程
5、 線(xiàn)程的主要操作方法
 • currentThread()、getName()、sleep()

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
[轉]Java中Runnable和Thread的區別
干貨分享|Java多線(xiàn)程面試知識點(diǎn)匯總(超詳細總結)
多線(xiàn)程詳解
Java多線(xiàn)程系列---“基礎篇”02之 常用的實(shí)現多線(xiàn)程的兩種方式
一道關(guān)于java線(xiàn)程的面試題
Java筆記(六 程序、進(jìn)程和線(xiàn)程)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久