java中的線程

1.進程:一條動態執行的程序。

2、線程:進程可以近一步細化爲線程。一個程序內部的一條執行路徑就叫做線程。如果把進程比喻
成一座灰常大的王府,那麼線程就是進出這座王府的一扇扇門。線程可以分爲:用戶線程、守護線程
和主線程。主線程我們一般是不需要考慮的。用戶線程是jvm在非守護線程都結束後自動離開,而守
護線程是用來服務守護線程的。怎麼說呢。。。當一個線程在所有其他的線程都結束以後仍然需要運
行,我們可以將這個線程設置爲守護線程,用setDaemon(true)進行設置。在java中,析構函數是典型的守護線程。

3、線程的狀態:新建狀態、可運行狀態、阻塞狀態、等待狀態、超時狀態和終止狀態。設置等待狀態可以用個Thread t1=new Thread(new Program()).sleep("500")來進行設置,其中Program實現了Runnable的接口。Thread.yield()方法會暫停正在執行的線程的對象,將機會給更高優先級的或者是相同優先級的線程。

4、線程的同步:用synchronized關鍵字。synchronized(){}是同步塊,()填的是一個唯一的地址變量,地址變量是唯一的一個,不可變更的。可以看成是一把鎖,當有線程用了這把鎖以後,那麼別的線程就只能等待,不能重新的獲取鎖來打開這個同步塊。

5、線程的加入:用t1.join()設置線程的加入。我發現了一個有趣的現象。先看下面的代碼:
public class Program {
 public static void main(String[] args) {
  System.out.println("主線程開始。。。");
  System.out.println("主線程結束。。。");
  T1 t1 = new T1();
  Thread thread1 = new Thread(t1);
  thread1.setName("t1線程");
  thread1.start();

  T2 t2 = new T2();
  Thread thread2 = new Thread(t2);
  thread2.setName("t2線程");
  thread2.start();
  for (int i = 0; i < 500; i++) {
     System.out.println(Thread.currentThread().getName()+":"+i);

             if(i==100){
   try {
      thread1.join();  //這裏設置了當i==100的時候thread1加入主線程
   } catch (InterruptedException e) {
       e.printStackTrace();
   }
     }
  }
 }
}
class T1 implements Runnable{

 public void run() {
    for (int i = 0; i < 500; i++) {
      System.out.println(Thread.currentThread().getName()+":"+i);

    }
 }
   }

class T2 implements Runnable{

   public void run() {
     for (int i = 0; i < 500; i++) {
 System.out.println(Thread.currentThread().getName()+":"+i);
     }
   }
}

當在主線程裏i設置了100的條件時,thread1加入線程中,可是在運行的過程中,主線程到i==100時就不會執行了,而是thread1和thread2交替執行,當thread1全部執行完時,thread2和主線程才交替運行。這個和大神說的順序執行可是不一樣的,因爲這裏的子線程有兩個,thread1是的確是和主線程順序執行的,但是thread2還是可以和thread1交替執行的。

6、匿名:
    new Thread(new Runnable() {
       public void run() {
          for (int i = 0; i < 500; i++) {
             System.out.println("線程t1..."+i);
          }
       }
    }).start();

 new Thread(new Runnable() {
   public void run() {
     for (int i = 0; i < 500; i++) {
        System.out.println("線程t2..."+i); 
     }
   }
 }).start();
可以在程序中把線程寫成這種形式,美其名曰:匿名

7.wait和notify是解決java中同步問題的重要方法,和synchronized結合使用。當synchronized方法或者是代碼塊中調用wait方法時,當前對象被終端運行,並且放棄該對象的鎖。當另外的對象調用notify方法時會喚醒某個等待池中的某個對象,使之成爲可運行的的線程。

 

發佈了38 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章