天天看點

**黑馬程式員_Java_多線程**

——Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! ——-

一.線程的定義:

1:就是應用程式有多條執行路徑。
                               程序:就是正在運作的程式。
                               線程:就是程序的執行路徑,執行單元。



                 2.線程與程序的差別:


                                一個程式啟動至少會有一個程序, 而一個程序中至少有一個線程.
                                線程是程序的一個實體,是CPU排程和分派的基本機關.



                 3:如何使用多線程程式:


                                 A:方式1 繼承Thread類。
                                           a:建立類繼承Thread類
                                           b:重寫Thread類的run()方法。
                                                   run()方法裡面才是封裝線程的代碼。
                                           c:通過調用start()方法啟動線程并調用run()方法。


                                代碼展現:                                  

                                public class MyThread extends Thread
                                {
                                        public void run()
                                        {
                                                  for(int x=0; x<100; x++)
                                                  {
                                                              System.out.println(getName()+"---"+"hello"+x);
                                                  }
                                        }
                                }

                                public MyThreadTest
                                 {
                                         public static void main(String[] args)
                                         {
                                                   MyThread my1 = new MyThread();
                                                   MyThread my2 = new MyThread();

                                                   my1.start();
                                                   my2.start();
                                           }
                                  }



                          B:方式2 實作Runnable接口
                                    a:建立一個類實作Runnable接口
                                    b:重寫run()方法
                                    c:建立實作類對象,并把它作為參數傳遞給Thread類的構造方法,建立Thread對象
                                    d:通過Thread的對象執行

                                   代碼展現:

                                   public class MyRunnable implements Runnable
                                   {
                                              public void run()
                                              {
                                                         for(int x=0; x<100; x++)
                                                        {
                                                                 System.out.println(Thread.currentThread().getName()+"---"+"hello"+x);
                                                         }
                                              }
                                    }


                               public class MyRunnableTest
                               {
                                        public static void main(String[] args)
                                        {
                                                 MyRunnable my = new MyRunnable();

                                                 Thread t1 = new Thread(my);
                                                 Thread t2 = new Thread(my);

                                                  t1.start();
                                                  t2.start();
                                         }
                               }



                        4:線程的随機性原理:
                                      多個程式其實是CPU的在做着高效切換執行的。

                        5.線程與程序的差別:
                                      一個程式啟動至少會有一個程序, 而一個程序中至少有一個線程.
                                     線程是程序的一個實體,是CPU排程和分派的基本機關.

                       6.常用方法:
                                     start() 啟動線程, 運作run()方法
                                     sleep(int ms) 目前線程休眠, 機關為毫秒
                                     currentThread() 擷取目前線程
                                     getName() 擷取線程的名字, main()方法會在main()線程中運作, 新啟動的線程如果沒指定名字會以 Thread-編号 形式命名
                                     setName(String name) 設定線程的名字
                                     setDaemon() 将線程設定為守護線程. 守護線程不會單獨運作. 如果程式運作時有非守護線程在運作, 程式不會結束
                                     join() 加入線程, 在目前線程中加入一個線程, 目前線程等待加入的線程運作結束之後繼續運作.
           

二.同步

1.什麼是同步

多線程并發通路, 産生延遲的時候, 會出現線程安全問題. 為了解決安全問題, 我們就需要使用同步.

2.怎麼同步

(a).同步代碼塊

使用synchronized關鍵字鎖定一個代碼塊, 指定鎖旗标, 就可以将代碼同步了.

在一個線程進入同步代碼之後, 其他使用相同鎖旗标的線程不能再執行, 直到第一個線程執行結束, 其他線程才能執行.

使用同一個鎖旗标的同步代碼, 隻能有一個線程執行.

( b).同步方法

在方法聲明上使用synchronized關鍵字修飾, 那麼整個方法都是同步的.

同步方法使用this作為鎖

3.死鎖

在同步代碼塊嵌套的時候, 使用不同的鎖時, 需要注意死鎖的問題, 不要造成沖突.

三.線程之間的通信

1.什麼是通信

在多線程并發的時候, 使用同步代碼塊時, 可以使用wait()和notify()方法控制線程通信.

2.api

wait() 使線程等待, 直到有人喚醒.

notify() 喚醒等待的一個線程, 随機的.

四.JDK5中的線程處理

1.同步

Lock lock = new ReentrantLock();

使用lock.lock()來開始同步

使用lock.unlock()結束同步, 注意解鎖的代碼放在finally中

2.通信

在JDK1.4之前使用的是鎖旗标對象的wait和notify來通信, 他們的缺點是無法準确的喚醒一個等待的線程.

而在JDK5之後, 使用Condition, 可以針對不同的分支喚醒. await()和signal()

——Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! ——-