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

Java單多線程求pair值算法比較

2022-06-13   來源: Java高級技術 

  進程和線程的概念

  什麼是進程

  一個進程就是在一個運行的程序它有自己獨立的內存空間一組系統資源每個進程的內部數據和狀態都是獨立的例如在window是同時打開多個記事本雖然它們所運行的程序代碼都是一樣的但是所使用的內存空間是獨立的互不干擾

  什麼是線程

  線程與進程相似是一段完成某個特定功能的代碼是程序中單個順序的流控制;但與進程不同的是同類的多個線程共享一塊內存空間和一組系統資源而線程本身的數據通常只有微處理器的寄存器數據以及一個供程序執行時使用的堆棧

  進程與線程的區別

   進程:每個進程都有獨立的代碼和數據空間(進程上下文) 進程切換的開銷大

   線程:輕量的進程同一類線程共享代碼和數據空間每個線程有獨立的運行棧和程序計數器(PC)線程切換的開銷小

   多進程:在操作系統中能同時運行多個任務程序

   多線程:在同一應用程序中有多個順序流同時執行

  線程創建的兩種方式

  采用繼承Thread類創建線程

  該方法比較簡單主要是通過繼承javalangThread類並覆蓋Thread類的run()方法來完成線成的創建Thread 類是一個具體的類即不是抽象類該類封裝了線程的行為要創建一個線程程序員必須創建一個從 Thread 類導出的新類Thread類中有兩個最重要的函數run()和start()

  通過實現Runnable接口創建線程

  該方法通過生成實現javalangRunnable接口的類該接口只定義了一個方法run()所以必須在新類中實現它但是 Runnable 接口並沒有任何對線程的支持我們還必須創建 Thread 類的實例這一點通過 Thread 類的構造函數

  public Thread(Runnable target);來實現

   單線程和多線程性能比較

  以使用蒙特卡羅概率算法求π為例進行單線程和多線程時間比較

  什麼是蒙特卡羅概率算法

  蒙特卡羅法(Monte Carlo method)是以概率和統計的理論方法為基礎的一種計算方法將所求解的問題同一定的概率模型相聯系用電子計算機實現統計模擬或抽樣以獲得問題的近似解故又稱統計模擬法或統計試驗法 百度百科

  蒙特卡羅求算法求π

  第一步

  畫正方形和內切圓

  

  第二步

  變換表達式

  正方形面積As=(R)^

  圓的面積Ac=πR^

  Ac/As=(R)^/πR^

  π=As/Ac

  令P=As/Sc則π=P

  第三步

  重復N次實驗求平均值

  在正方形區域內隨機生成一個點A若A落在圓區域內M++

  P=M/N

  π=PN的取值越大π的值越精確

   java代碼實現算法

  N取值為多線程的數為每個線程執行萬次模擬實驗

  線程實現

  import ncurrentCountDownLatch;

  public class ProModel implements Runnable {

  public int N;//隨機實驗的總次數

  public static int M;//隨機點落在圓中的次數

  private int id;

  private final CountDownLatch doneSignal;

  OBJ semaphore;

  public ProModel(int idCountDownLatch doneSignalint NOBJ semaphore){

  thisid=id;

  thisdoneSignal=doneSignal;

  thisN=N;

  thissemaphore=semaphore;

  M=;

  }

  public void run(){

  int tempM=;

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

  if(isInCircle()){

  tempM++;

  }

  }

  synchronized (semaphore) {

  add(tempM);

  }

  untDown();//使end狀態減

  }

  public  void add(int tempM){

  Systemoutprintln(ThreadcurrentThread()getName());

  M=M+tempM;

  Systemoutprintln(M);

  }

  //隨機產生一個在正方形區域的點判斷它是否在圓中

  public boolean isInCircle(){

  double x=Mathrandom();

  double y=Mathrandom();

  if((x)*(x)+(y)*(y)<)

  return true;

  else

  return false;

  }

  public static int getTotal(){

  return M;

  }

  }

  多線程Main實現

  import ncurrentCountDownLatch;

  import ncurrentExecutorService;

  import ncurrentExecutors;

  public class MutliThread {

  public static void main(String[] args) throws InterruptedException {

  long begin=SystemcurrentTimeMillis();

  int threadSize=;

  int N=;

  OBJ semaphore = new OBJ();

  CountDownLatch doneSignal  = new CountDownLatch(threadSize);

  ProModel[] pros=new ProModel[threadSize];

  //設置特定的線程池大小為threadSizde

  Systemoutprintln(begins!);

  ExecutorService exe = ExecutorsnewFixedThreadPool(threadSize);

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

  exeexecute(new ProModel(i+doneSignalNsemaphore));

  try{

  doneSignalawait();            //等待end狀態變為           }catch (InterruptedException e) {

  // TODO: handle exception

  eprintStackTrace();

  }finally{

  Systemoutprintln(ends!);

  Systemoutprintln(*(float)ProModelgetTotal()/(float)(threadSize*N));

  }

  exeshutdown();

  long end=SystemcurrentTimeMillis();

  Systemoutprintln(used time(ms):+(endbegin));

  }

  }

  class OBJ{}

  單線程Main實現

  import ncurrentCountDownLatch;

  import ncurrentExecutorService;

  import ncurrentExecutors;

  public class SingleThread {

  public static void main(String[] args) {

  long begin=SystemcurrentTimeMillis();

  int threadSize=;

  int N=;

  OBJ semaphore = new OBJ();

  CountDownLatch doneSignal  = new CountDownLatch(threadSize);

  ProModel[] pros=new ProModel[threadSize];

  //設置特定的線程池大小為

  Systemoutprintln(begins!);

  ExecutorService exe = ExecutorsnewFixedThreadPool(threadSize);

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

  exeexecute(new ProModel(i+doneSignalNsemaphore));

  try{

  doneSignalawait();            //等待end狀態變為           }catch (InterruptedException e) {

  // TODO: handle exception

  eprintStackTrace();

  }finally{

  Systemoutprintln(ends!);

  Systemoutprintln(*(float)ProModelgetTotal()/(float)(threadSize*N));

  }

  exeshutdown();

  long end=SystemcurrentTimeMillis();

  Systemoutprintln(used time(ms):+(endbegin));

  }

  }

  運行結果比較

   

  根據運行結果看由於多線程運行時要進行分配資源的操作在單機上的運行速度並沒有單線程效率高


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