熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java多線程的相關機制

2013-11-23 19:50:38  來源: Java高級技術 

  一 線程的基本概念

  線程是一個程序內部的順序控制流一個進程相當於一個任務一個線程相當於一個任務中的一條執行路徑多進程:在操作系統中能同時運行多個任務(程序)多線程:在同一個應用程序中有多個順序流同時執行Java的線程是通過javalangThread類來實現的JVM啟動時會有一個由主方法(public static void main(){})所定義的線程可以通過創建Thread的實例來創建新的線程每個線程都是通過某個特定Thread對象所對應的方法run()來完成其操作的方法run()稱為線程體通過調用Thread類的start()方法來啟動一個線程

  二 線程的創建和啟動

  可以有兩種方式創建新的線程:

  第一種:

  定義線程類實現Runnable接口

  Thread myThread = new Thread(target);   //target為Runnable接口類型

  Runnable中只有一個方法:public void run();用以定義線程運行體

  使用Runnable接口可以為多個線程提供共享的數據

  在實現Runnable接口的類的run()方法定義中可以使用Thread的靜態方法public static Thread currentThread();獲取當前線程的引用

  第二種:

  可以定義一個Thread的子類並重寫其run方法如:

  class MyThread extends Thread {

  public void run() {}

  }

  然後生成該類的對象:

  MyThread myThread = new MyThread();

  三 線程控制的基本方法

  isAlive():判斷線程是否還

  getPriority():獲得線程的優先級數值

  setPriority():設置線程的優先級數值

  Threadsleep():將當前線程睡眠指定毫秒數

  join():調用某線程的該方法將當前線程與該線程合並即等待該線程結束再恢復當前線程的運行

  yield():讓出cpu當前線程進入就緒隊列等待調度

  wait():當前線程進入對象的wait pool

  notify()/notifyAll():喚醒對象的wait pool中的一個/所有等待線程

  四 線程同步

  實現生產者消費者問題來說明線程問題舉例如下所示:

  /**

  * 生產者消費者問題

  */

  package combasicthread;

  /**

  * @author johnston

  *

  * @version

  */

  public class ProducerConsumer {

  /**

  * @param args

  */

  public static void main(String[] args) {

  ProductBox pb = new ProductBox();

  Producer p = new Producer(pb);

  Consumer c = new Consumer(pb);

  Thread pThread = new Thread(p);

  Thread cThread = new Thread(c);

  pThreadsetPriority(ThreadMAX_PRIORITY);

  pThreadstart();

  cThreadstart();

  }

  }

  /**

  * 產品對象

  * @author johsnton

  */

  class Product {

  int id;

  public Product(int id) {

  super();

  thisid = id;

  }

  public String toString(){

  return Product: + id;

  }

  }

  /**

  * 產品盒對象

  * @author johnston

  */

  class ProductBox {

  Product[] productbox = new Product[];

  int index = ;

  public ProductBox() {

  super();

  }

  public synchronized void push(Product p) {

  while (index == productboxlength) {

  try {

  thiswait();

  } catch (InterruptedException e) {

  // TODO Autogenerated catch block

  eprintStackTrace();

  }

  }

  thisnotify();

  productbox[index] = p;

  index ++;

  }

  public synchronized Product pop() {

  while (index == ) {

  try {

  thiswait();

  } catch (InterruptedException e) {

  // TODO Autogenerated catch block

  eprintStackTrace();

  }

  }

  thisnotify();

  index ;

  return productbox[index];

  }

  }

  /**

  * 生產者

  * @author johnston

  */

  class Producer implements Runnable {

  ProductBox productbox = null;

  public Producer(ProductBox productbox) {

  super();

  thisproductbox = productbox;

  }

  @Override

  public void run() {

  // TODO Autogenerated method stub

  for (int i=; i<; i++) {

  Product p = new Product(i);

  productboxpush(p);

  Systemoutprintln(produce: + p);

  try {

  Threadsleep((int)(Mathrandom() * ));

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  }

  }

  /**

  * 消費者

  * @author johnston

  */

  class Consumer implements Runnable {

  ProductBox productbox = null;

  public Consumer(ProductBox productbox) {

  super();

  thisproductbox = productbox;

  }

  @Override

  public void run() {

  // TODO Autogenerated method stub

  for (int i=; i<; i++) {

  Product p = productboxpop();

  Systemoutprintln(consume: + p);

  try {

  Threadsleep((int)(Mathrandom() * ));

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  }

  }


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27546.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.