国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java基本教學:線程入門

2019-11-17 06:11:08
字體:
來源:轉載
供稿:網友
  線程是java的內嵌特性,線程并不輕易把握,有專門介紹Java線程的書籍,讀者可以參考。由此可見Java線程的重要性,本文將具體介紹線程的基本知識。

  有的時候你可能想寫一個程序,每隔一段時間執行相關的任務,這個時候你可以使用Timer和TimerTask,非常方便。你可以參考這里。

  在Java中實現一個線程有兩種方法,第一是實現Runnable接口實現它的run()方法,第二種是繼續Thread類,覆蓋它的run()方法。下面是代碼示例:


  public class DoSomething implements Runnable {
  public void run(){
  // here is where you do something
  }
  }
  public class DoAnotherThing extends Thread {
  public void run(){
  // here is where you do something
  }
  }

  這兩種方法的區別是,假如你的類已經繼續了其它的類,那么你只能選擇實現Runnable接口了,因為Java只答應單繼續的。

  Java中的線程有四種狀態分別是:運行、就緒、掛起、結束。假如一個線程結束了也就說明他是一個死線程了。當你調用一個線程實例的start()的方法的時候,這個時候線程進入就緒狀態,注重并不是運行狀態,當虛擬機開始分配給他CPU的運行時間片的時候線程開始進入運行狀態,當線程進入等待狀態,例如等待某個事件發生的時候,這時候線程處于掛起狀態。

  啟動一個線程你只需要調用start()方法,針對兩種實現線程的方法也有兩種啟動線程的方法,分別如下:


  DoSomething doIt = new DoSomething();
  Thread myThread = new Thread( doIt );
  myThread.start();

  DoAnotherThing doIt = new DoAnotherThing();
  doIt.start();



  由于安全等因素Thread中的stop()方法已經不推薦使用了,因此假如你想要停止一個線程的時候可以通過設置一個信號量,例如:


  public class MyThread implements Runnable {
  PRivate boolean quit = false;

  public void run(){
  while( !quit ){
  // do something
  }
  }

  public void quit(){
  quit = true;
  }
  }







  假如每個線程只做它自己的事情,那么就很簡單了,但是有的時候幾個線程可能要同時訪問一個對象并可能對它進行修改,這個時候你必須使用線程的同步在方法或者代碼塊使用要害字synchronized,例如:


  public class Counter {
  private int counter;

  public synchronized int increment(){
  return ++counter;
  }

  public synchronized int decrement(){
  if( --counter < 0 ){
  counter = 0;
  }

  return counter;
  }
  }



  每個java對象都可以最為一個監視器,當線程訪問它的synchronized方法的時候,他只答應在一個時間只有一個線程對他訪問,讓其他得線程排隊等候。這樣就可以避免多線程對共享數據造成破壞。記住synchronized是會耗費系統資源降低程序執行效率的,因此一定要在需要同步的時候才使用,尤其在J2ME的開發中要小心。

  假如你要是想讓線程等待某個事件的發生然后繼續執行的話,那么這就涉及到線程的調度了。在java中通過wait(),notify(),notifyAll()來實現,這三個方法是在Object類中定義的,當你想讓線程掛起的時候調用obj.wait()方法,在同樣的obj上調用notify()則讓線程重新開始運行。

  最后以SUN提供的ProdUCer/Consumer的例子來結束這篇文章,內容是Producer產生一個數字而Consumer消費這個數字,這個小程序里面基本覆蓋了本文所有的知識點。請具體研究一下代碼


  public class Producer extends Thread {
  private CubbyHole cubbyhole;
  private int number;

  public Producer(CubbyHole c, int number) {
  cubbyhole = c;
  this.number = number;
  }

  public void run() {
  for (int i = 0; i < 10; i++) {
  cubbyhole.put(i);
  System.out.println("Producer #" + this.number
  + " put: " + i);
  try {
  sleep((int)(Math.random() * 100));
  } catch (InterruptedException e) { }
  }
  }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 北安市| 阜南县| 高尔夫| 增城市| 昭觉县| 旺苍县| 扎赉特旗| 南丰县| 南川市| 屯门区| 三河市| 阜新市| 株洲县| 黎城县| 乌审旗| 高碑店市| 石阡县| 泰州市| 公主岭市| 朝阳区| 九寨沟县| 宝山区| 渭源县| 三台县| 台东市| 积石山| 望城县| 彩票| 集贤县| 泰宁县| 曲沃县| 商洛市| 天津市| 会同县| 嘉荫县| 卢氏县| 泰州市| 葫芦岛市| 芒康县| 乌鲁木齐县| 大城县|