1. 程式人生 > >Java張孝祥視訊 學習筆記 多執行緒

Java張孝祥視訊 學習筆記 多執行緒

/*************************************************************************************/ 此部落格主要是在觀看張孝祥老師的教學視訊的過程中,自己所做的學習筆記,在此以部落格的形式分享出來,方便大家學習,建議大家觀看視訊,以此筆記作為回顧資料。 參考資料 傳智播客_張孝祥_Java多執行緒與併發庫高階應用視訊教程下載 視訊下載 /*******************01張孝祥傳統執行緒技術回顧************************/ 建立執行緒的兩種方式: 1,建立Thread的子類,重寫run方法
2,給Thread類傳入Runnable介面 兩種方式的區別: 第二種方式可以實現資料共享,而且更傾向於面向物件的程式設計思想。一般都是採用第二種方式。 new Thread().start(); 呼叫了start方法後,就會執行Thread類的run方法,如下 public void run(){     if(target!=null){        targe.run();     } } 如果target為空,就什麼也不做 new Thread(         new Runnable(){              public void run() { //1
       }   ){        public void run() { //2 }.start(); 執行的是2run方法 執行的步驟: 先執行子類的run方法,如果子類沒有重寫run方法,就去執行父類的run方法,上述程式碼中子類重寫了run方法,所以就不會執行Runnable中的run方法。 /*******************02張孝祥傳統定時器技術回顧************************/
 1秒後,炸一次  new Timer().schedule(new TimerTask() {        @Override
       public void run() {             System.out.println("bombing!"); }   }, 1000); 每隔兩秒炸一次<一方式>
new Timer().schedule(new TimerTask() {        @Override        public void run() {             System.out.println("bombing!"); } }, 1000,2000);  每隔兩秒鐘炸一次 <二方式>  new Timer().schedule(new MyTimerTask(), 2000);  class MyTimerTask extends TimerTask{    @Override    public void run() {         System.out.println("bombing!");         new Timer().schedule(new MyTimerTask(),2000);      }   } 注意:每個TimerTask()只能執行一次 先隔一秒炸一次,再隔兩秒鐘炸一次,再擱一秒鐘炸一次,。。。。 private static int count =0; new Timer().schedule(new MyTimerTask(), 1000); class MyTimerTask extends TimerTask{    @Override    public void run() {          count = (count+1)%2;         System.out.println("bombing!");         new Timer().schedule(new TimerTask(),1000+count*1000);      } } /*******************03張孝祥傳統執行緒互斥技術************************/
在靜態方法中,不能new內部類的例項物件 原因: 內部類,可以訪問外部類的成員變數,呼叫靜態方法的時候,沒有建立物件,此時沒有可以訪問的成員變數,所以會報錯。 回顧需要重新看視訊 
/*******************04張孝祥傳統執行緒同步通訊技術************************/
回顧需要重新看視訊 /*******************05張孝祥執行緒範圍內變數的概念************************/
執行緒內部共享資料,執行緒間資料獨立 package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random; public class ThreadScopeShareData {  private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();  public static void main(String[] args) {       for(int i=0;i<2;i++){            new Thread(new Runnable(){            @Override             public void run() {                  int data = new Random().nextInt();                  System.out.println(Thread.currentThread().getName() + " has put data :" + data);                   threadData.put(Thread.currentThread(), data);                  new A().get();                  new B().get();             }        }).start();    }  }   static class A{       public void get(){            int data = threadData.get(Thread.currentThread());            System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data);       }  }  static class B{       public void get(){       int data = threadData.get(Thread.currentThread());       System.out.println("B from " + Thread.currentThread().getName()+ " get data :" + data);     }  } } /*******************06張孝祥ThreadLocal類及其應用技巧************************/
ThreadLocal類,實現了執行緒內部共享資料,執行緒間資料獨立,比05節視訊中的更加簡化方便

《1》 import java.util.HashMap; import java.util.Map; import java.util.Random; public class ThreadLocalTest {      public static void main(String[] args) {           new ThreadLocalTest().init();      }    //init      private void init(){           for(int i =0;i<2;i++){                new Thread(new Runnable() {                     public void run() {                          int data = new Random().nextInt();                          Person.getThreadInstance().setName(Thread.currentThread().getName());                           Person.getThreadInstance().setAge(data);                          new A().get();                           new B().get();                 }             }).start();         }     }   //A  class A {       Person person = Person.getThreadInstance();       public void get(){            System.out.println("A:-"+Thread.currentThread().getName()+":name:"+person.getName()+":age:"+person.getAge());          }  }  //B  class B {       Person person = Person.getThreadInstance();       public void get(){            System.out.println("B:-"+Thread.currentThread().getName()+":name:"+person.getName()+":age:"+person.getAge());       } }  //Person   將跟執行緒相關的繫結,放在共享的資料類的內部實現      static class Person{           private static ThreadLocal<Person>  threadLocal = new ThreadLocal<ThreadLocalTest.Person>();            private Person(){           }          public static Person  getThreadInstance(){                Person person = threadLocal.get();                if(person==null){                     person = new Person();                     threadLocal.set(person);                }                return person;.          }           private String name;           private int age;           public String getName() {                return name;           }           public void setName(String name) {                 this.name = name;           }           public int getAge() {                return age;           }           public void setAge(int age) {                this.age = age;           }     }  }
《2》
import java.util.HashMap; import java.util.Map; import java.util.Random; public class ThreadLocalTest {      public static final ThreadLocal<Person>  threadlocal = new  ThreadLocal(){               @Override               protected Object initialValue() {                    return new Person();               }     };      public static void main(String[] args) {           new ThreadLocalTest().init();      }      private void init(){           for(int i =0;i<2;i++){                new Thread(new Runnable() {                     public void run() {                          int data = new Random().nextInt();                          threadlocal.get().setName(Thread.currentThread().getName());                          threadlocal.get().setAge(data);                          new A().get();                          new B().get();                 }            }).start();         }     }      //A      class A {           Person person = threadlocal.get();           public void get(){                System.out.println("A:-"+Thread.currentThread().getName()+":name:"+person.getName()+":age:"+person.getAge());              }      }    //B     class B {        Person person = threadlocal.get();        public void get(){            System.out.println("B:-"+Thread.currentThread().getName()+":name:"+person.getName()+":age:"+person.getAge());         }     }       //Person        static class Person{           public Person(){            }           private String name;            private int age;           public String getName() {                return name;           }           public void setName(String name) {                 this.name = name;           }           public int getAge() {                return age;           }           public void setAge(int age) {                this.age = age;           }     } } /************07張孝祥多個執行緒之間共享資料的方式的討論**************/
如果每個執行緒執行的程式碼相同,可以使用同一個Runnable物件,這個Runnable物件中有那個共享資料,例如,買票系統就可以這麼做。 如果每個執行緒執行的程式碼不同,這時候需要用不同的Runnable物件,有如下兩種方式來實現這些Runnable物件之間的資料共享: 第一種: 將共享資料封裝在另外一個物件中,然後將這個物件逐一傳遞給各個Runnable物件。每個執行緒對共享資料的操作方法也分配到那個物件身上去完成,這樣容易實現針對該資料進行的各個操作的互斥和通訊。  第二種:將這些Runnable物件作為某一個類中的內部類,共享資料作為這個外部類中的成員變數,每個執行緒對共享資料的操作方法也分配給外部類,以便實現對共享資料進行的各個操作的互斥和通訊,作為內部類的各個Runnable物件呼叫外部類的這些方法。 上面兩種方式的組合:將共享資料封裝在另外一個物件中,每個執行緒對共享資料的操作方法也分配到那個物件身上去完成,物件作為這個外部類中的成員變數或方法中的區域性變數,每個執行緒Runnable物件作為外部類中的成員內部類或區域性內部類。 總之,要同步互斥的幾段程式碼最好是分別放在幾個獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現它們之間的同步互斥和通訊。  極端且簡單的方式,即在任意一個類中定義一個static的變數,這將被所有執行緒共享。 設計四個執行緒,其中兩個執行緒每次對j加一,另外兩個執行緒每次對j減一
第一種示例程式碼 public class MultiThreadShareData {    private static ShareData shareData = new ShareData();   public static void main(String[] args) {       MyRunnable1 runNable1 = new MyRunnable1(shareData);       MyRunnable2 runNable2 = new MyRunnable2(shareData);       new Thread(runNable1).start();       new Thread(runNable2).start();   } class ShareData{      private int j =0;  public ShareData(){       public void increment(){           j++;      }      public void decrement(){           j--;      } } class MyRunnable1 implements Runnable{      private ShareData shareData;      public MyRunnable1(ShareData shareData){           this.shareData = shareData;      }      public void run() {           this.shareData.increment();      } class MyRunnable2 implements Runnable{     private ShareData shareData;     public MyRunnable2(ShareData shareData){           this.shareData = shareData;      }     public void run() {           this.shareData.decrement();      } 或者 public class MultiThreadShareData {    public static void main(String[] args) {       MultiThreadShareData multiThreadShareData = new MultiThreadShareData(); ShareData shareData = multiThreadShareData.new ShareData();        MyRunnable1 runNable1 = multiThreadShareData.new MyRunnable1(shareData);       MyRunnable2 runNable2 = multiThreadShareData.new MyRunnable2(shareData);       new Thread(runNable1).start();       new Thread(runNable2).start();   } class ShareData{      private int j =0;  public ShareData(){       public void increment(){           j++;      }      public void decrement(){           j--;      } } class MyRunnable1 implements Runnable{      private ShareData shareData;      public MyRunnable1(ShareData shareData){           this.shareData = shareData;      }      public void run() {           this.shareData.increment();      } class MyRunnable2 implements Runnable{     private ShareData shareData;     public MyRunnable2(ShareData shareData){           this.shareData = shareData;      }     public void run() {           this.shareData.decrement();      } 第二種示例程式碼 public class MultiThreadShareData { public static void main(String[] args) {  final ShareData shareData = new ShareData();          new Thread(new Runnable() {  public void run() {                      shareData.increment();              }         }).start();         new Thread(new Runnable() { public void run() {                   shareData.decrement();

相關推薦

Java視訊 學習筆記 執行

/*************************************************************************************/ 此部落格

Java第十四天學習筆記~執行執行直接通訊---等待喚醒機制、生產者消費者問題、JDK1.5新特性、wait和sleep區別)

執行緒直接通訊示例 //資源 class Resource { String name; String sex; } //輸入 class Input implements Runnable { Resource r; Input(Resource r) { this.r=r;

java學習筆記-執行程式設計模擬十個人過山洞

編寫多執行緒應用程式,模擬多個人通過一個山洞的模擬。這個山洞每次只能通過一個人,每個人通過山洞的時間為5秒,隨機生成10個人,同時準備過此山洞,顯示一下每次通過山洞人的姓名。   使用執行緒同步,把山洞看做臨界資源,五秒內只允許一個人來訪問。 class cave { p

Java第十三天學習筆記~執行執行的狀態、建立執行的第二種方式、同步程式碼塊、同步函式)

                                 多執行緒 執行緒的狀態 CPU的執行資格:可以被C

學習筆記-執行程式設計與執行同步

    執行緒基礎  程序與執行緒 我們執行一個exe,就是一個程序例項,系統中有很多個程序。每一個程序都有自己的記憶體地址空間,每個程序相當於一個獨立的邊界,有自己的獨佔的資源,程序之間不能共享程式碼和資料空間。 每一個程序有一個或多個執行緒,程

學習筆記-執行

多執行緒 執行緒與程序存在一定區別,每一個程序必須有一個執行緒,執行緒才是程式執行的最小單元程序實際上會在已有的程序空間中執行,在同一個程序裡面,執行緒與執行緒之間是相互獨立,都可以訪問到程序空間裡面的公共變數,而程序與程序之間完全獨立,沒有任何的共享空間,從而導致程序與程序之間的通訊非

學習筆記-執行補充

多執行緒pool補充 在python中沒有辦法使用佇列進行傳入到pool中 這就導致如果要使用傳入佇列,那麼需要使用另外的封裝方法 使用pool和佇列模擬檔案複製 import random import time from multiprocessing import M

學習筆記——執行(持續更新中)

1、程序與執行緒的區別:程序是所有執行緒的集合,每一個執行緒是程序中的執行路徑。      根據我的理解,其實程序就可以看成是公共廁所,執行緒看做是廁所裡的隔斷間,一個廁所可以有很多個隔斷間,也可以有一個隔斷間。當人們上廁所的時候,如果廁所只有一個隔斷間上廁所的只有一個人,

Python3學習筆記--執行

python並非真正意義上的多執行緒,不支援多核,只能單核,這是因為全域性鎖的原因 如果多個執行緒共享一個記憶體,如何做限制: threading.RLock() lock.release() .join:表示必須等上一個函式執行完再執行下一個函式

Linux程式設計學習筆記----執行程式設計執行同步機制之互斥量(鎖)與讀寫鎖

互斥鎖通訊機制 基本原理 互斥鎖以排他方式防止共享資料被併發訪問,互斥鎖是一個二元變數,狀態為開(0)和關(1),將某個共享資源與某個互斥鎖邏輯上繫結之後,對該資源的訪問操作如下: (1)在訪問該資源之前需要首先申請互斥鎖,如果鎖處於開狀態,則申請得到鎖並立即上鎖(關),防

Linux程式設計學習筆記----執行程式設計之執行同步條件變數

轉載請註明出處:http://blog.csdn.net/suool/article/details/38582521. 基本概念與原理 互斥鎖能夠解決資源的互斥訪問,但是在某些情況下,互斥並不能解決問題,比如兩個執行緒需 要互斥的處理各自的操作,但是一個執行緒的操作僅僅存

C++學習筆記--執行

執行緒與程序優缺點對比: 多執行緒開銷小,但難於管理,且不能用於分散式系統; 多程序開銷大,作業系統會進行一部分管理,因此使用者管理就比較簡單,可用於分散式; 通常多執行緒和多程序結合使用。 參考資料:http://edu.csdn.net/course

tensorflow學習筆記——執行輸入資料處理框架

  之前我們學習使用TensorFlow對影象資料進行預處理的方法。雖然使用這些影象資料預處理的方法可以減少無關因素對影象識別模型效果的影響,但這些複雜的預處理過程也會減慢整個訓練過程。為了避免影象預處理成為神經網路模型訓練效率的瓶頸,TensorFlow提供了一套多執行緒處理輸入資料的框架。   下面總結了

201711671103《JAVA程式設計》第十二章執行機制學習筆記

教材學習內容總結 1.執行緒是依附於程序的,程序是分配資源的最小單位,執行緒是比程序更小的執行單位。一個程序可以產生多個執行緒,形成多條執行線索。每條線索,即每個執行緒也有它自身的產生,存在和消亡過程,也是一個動態的概念。 2.JAVA 中的多執行緒機制:多執行緒是指一個應用程式同時存在好幾

JAVA執行學習筆記 停止執行

在這裡要注意interrupt()方法,線上程正常執行的時候,呼叫 interrupt() 並不能結束執行緒。 正確的結束執行緒的姿勢如下: <span style="white-space:p

Java筆記--執行

Java筆記–多執行緒 在講執行緒之前有必要討論一下程序的定義:程序是程式在一個數據集合上執行的過程,它是系統進行資源分配和排程的一個獨立單位。程序實體由程式段, 資料段 PCB(程序控制塊)組成。執行緒又是什麼?執行緒可以看做輕量級程序,執行緒是程序的執行單元,是程序排程

執行學習筆記--04執行間的通訊(通訊管道實現執行間的通訊)

 1.執行緒間的通訊        通過管道實現執行緒間的通訊:位元組流        通訊關單實現執行緒間的通訊:字元流        等待通知之交叉備份

執行學習筆記--03執行間的通訊(wait/notify)

1.執行緒間的通訊      使用wait/notify來實現執行緒間的通訊      生產者/消費者模式的實現      方法join的使用     ThreadLocal

Java筆記-執行執行控制

執行緒控制 我們已經知道了執行緒的排程,接下來我們就可以使用如下方法物件執行緒進行控制。 1.執行緒休眠 public static void sleep(long millis):讓當前執行緒處於暫停狀態,millis引數毫秒值,即暫停時間。 程式

Java學習筆記之--------執行基本資訊

執行緒常用的幾個方法如下: isAlive() :測試執行緒是否處於活動狀態。 setName(String name) :改變執行緒名稱,使之與引數 name 相同。 getName() :返回該執行緒的名稱。 setPriority(int newP