知识大全 Java单多线程求pair值算法比较

Posted

篇首语:见强不怕,遇弱不欺。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java单多线程求pair值算法比较相关的知识,希望对你有一定的参考价值。

Java单多线程求pair值算法比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   进程和线程的概念

   什么是进程

  一个进程就是在一个运行的程序 它有自己独立的内存空间 一组系统资源 每个进程的内部数据和状态都是独立的 例如在window是同时打开多个记事本 虽然它们所运行的程序代码都是一样的 但是所使用的内存空间是独立的 互不干扰

   什么是线程

  线程与进程相似 是一段完成某个特定功能的代码 是程序中单个顺序的流控制;但与进程不同的是 同类的多个线程共享一块内存空间和一组系统资源 而线程本身的数据通常只有微处理器的寄存器数据 以及一个供程序执行时使用的堆栈

   进程与线程的区别

   进程:每个进程都有独立的代码和数据空间(进程上下文) 进程切换的开销大

   线程:轻量的进程 同一类线程共享代码和数据空间 每个线程有独立的运行栈和程序计数器(PC) 线程切换的开销小

   多进程:在操作系统中 能同时运行多个任务程序

   多线程:在同一应用程序中 有多个顺序流同时执行

   线程创建的两种方式

  采用继承Thread类创建线程

  该方法比较简单 主要是通过继承java lang Thread类 并覆蓋Thread类的run()方法来完成线成的创建 Thread 类是一个具体的类 即不是抽象类 该类封装了线程的行为 要创建一个线程 程序员必须创建一个从 Thread 类导出的新类 Thread类中有两个最重要的函数run()和start()

  通过实现Runnable接口创建线程

  该方法通过生成实现java lang Runnable接口的类 该接口只定义了一个方法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

  π= P N的取值越大 π的值越精确

   java代码实现算法

  N取值为 万 多线程的数为 每个线程执行 万次模拟实验

  线程实现

  import ncurrent CountDownLatch;

  public class ProModel implements Runnable

  public int N;//随机实验的总次数

  public static int M;//随机点落在圆中的次数

  private int id;

  private final CountDownLatch doneSignal;

  OBJ semaphore;

  public ProModel(int id CountDownLatch doneSignal int N OBJ semaphore )

  this id=id;

  this doneSignal=doneSignal;

  this N=N;

  this semaphore=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)

  System out println(Thread currentThread() getName());

  M=M+tempM;

  System out println(M);

  

  //随机产生一个在正方形区域的点 判断它是否在圆中

  public boolean isInCircle()

  double x=Math random();

  double y=Math random();

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

  return true;

  else

  return false;

  

  public static int getTotal()

  return M;

  

  

  多线程Main实现

  import ncurrent CountDownLatch;

  import ncurrent ExecutorService;

  import ncurrent Executors;

  public class MutliThread

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

  long begin=System currentTimeMillis();

  int threadSize= ;

  int N= ;

  OBJ semaphore = new OBJ();

  CountDownLatch doneSignal  = new CountDownLatch(threadSize);

  ProModel[] pros=new ProModel[threadSize];

  //设置特定的线程池 大小为threadSizde

  System out println( begins! );

  ExecutorService exe = Executors newFixedThreadPool(threadSize);

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

  exe execute(new ProModel(i+ doneSignal N semaphore));

  try

  doneSignal await();            //等待end状态变为            catch (InterruptedException e)

  // TODO: handle exception

  e printStackTrace();

  finally

  System out println( ends! );

  System out println( *(float)ProModel getTotal()/(float)(threadSize*N));

  

  exe shutdown();

  long end=System currentTimeMillis();

  System out println( used time(ms): +(end begin));

  

  

  class OBJ

  单线程Main实现

  import ncurrent CountDownLatch;

  import ncurrent ExecutorService;

  import ncurrent Executors;

  public class SingleThread

  public static void main(String[] args)

  long begin=System currentTimeMillis();

  int threadSize= ;

  int N= ;

  OBJ semaphore = new OBJ();

  CountDownLatch doneSignal  = new CountDownLatch(threadSize);

  ProModel[] pros=new ProModel[threadSize];

  //设置特定的线程池 大小为

  System out println( begins! );

  ExecutorService exe = Executors newFixedThreadPool(threadSize);

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

  exe execute(new ProModel(i+ doneSignal N semaphore));

  try

  doneSignal await();            //等待end状态变为            catch (InterruptedException e)

  // TODO: handle exception

  e printStackTrace();

  finally

  System out println( ends! );

  System out println( *(float)ProModel getTotal()/(float)(threadSize*N));

  

  exe shutdown();

  long end=System currentTimeMillis();

  System out println( used time(ms): +(end begin));

  

  

  运行结果比较

   

cha138/Article/program/Java/gj/201311/27648

相关参考

知识大全 关于各种排列组合java算法实现方法

  一利用二进制状态法求排列组合此种方法比较容易懂但是运行效率不高小数据排列组合可以使用复制代码代码如下:importjavautilArrays;  //利用二进制算法进行全排列//count://

知识大全 java的volatile与多线程

  Java语言规范中指出为了获得最佳速度允许线程保存共享成员变量的私有拷贝而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比  Volatile修饰的成员变量在每次被线程访问时都强迫从

知识大全 新特征-有返回值的线程

Java线程:新特征-有返回值的线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 java破解ip屏蔽+多线程同步拨号

  单线程破解ip屏蔽比较容易只要拨号就行了  多线程抓取数据也比较容易但是引入多线程之后拨号就容易出现问题  多线程抓取的时候这个拨号就比较麻烦一点因为多线程拨号  会出现第一个线程拨号的时候第二个

知识大全 获取java线程中信息的两种方法[1]

   在进行多线程编程中比较重要也是比较困难的一个操作就是如何获取线程中的信息大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中然后再提供一个获取方

知识大全 java数字图像处理常用算法

    前些时候做毕业设计用java做的数字图像处理方面的东西这方面的资料ms比较少发点东西上来大家共享一下主要就是些算法有自己写的有人家的还有改人家的有的算法

知识大全 java线程简介(线程的生命)

  创建线程      在Java程序中创建线程有几种方法每个Java程序至少包含一个线程主线程其它线程都是通过Thread构造器或实例化继承类Thread的类来创建的    Java线程可以通过直接

知识大全 Java多线程如何创建多个线程

Java多线程如何创建多个线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java多线程的同

知识大全 JAVA 线程编程----两个线程的程序

JAVA线程编程----两个线程的程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  于Java

知识大全 Java的多线程-实现多线程及线程的同步

Java的多线程-实现多线程及线程的同步  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一.实现