多线程-我这样是否对同一个对象进行了排序(小猿一只,评论勿留情)

问题描述

我这样是否对同一个对象进行了排序(小猿一只,评论勿留情)

import java.util.Random;

public class MergeSort implements Runnable{

public void run()
{
    int[] a = new int[100000];
    Random p = new Random();    //产生随机数
    for(int i=0;i<100000;i++)
        a[i] = p.nextInt(10000);
  //计时
  //long startMili=System.currentTimeMillis();// 当前时间对应的毫秒数
  //System.out.println("总耗时为:"+(startMili)+"毫秒");
  mergeSort(a, 0, 1);
  //long endMili=System.currentTimeMillis();
  //System.out.println("总耗时为:"+(endMili)+"毫秒");
  //System.out.println("n总耗时为:"+(endMili-startMili)+"毫秒");
}
 // private static long sum = 0;  

 /**
  * <pre>
  * 二路归并
  * 原理:将两个有序表合并和一个有序表
  * </pre>
  *
  * @param a
  * @param s
  *            第一个有序表的起始下标
  * @param m
  *            第二个有序表的起始下标
  * @param t
  *            第二个有序表的结束下标
  *
  */
 private static void merge(int[] a, int s, int m, int t) {
  int[] tmp = new int[t - s + 1];  

  int i = s, j = m, k = 0;
  while (i < m && j <= t) {
   if (a[i] <= a[j]) {
    tmp[k] = a[i];
    k++;
    i++;
   } else {
    tmp[k] = a[j];
    // sum += (j - i) - (j - m);
    j++;
    k++;
   }
  }
  while (i < m) {
   tmp[k] = a[i];
   i++;
   k++;
  }  

  while (j <= t) {
   tmp[k] = a[j];
   j++;
   k++;
  }  

  System.arraycopy(tmp, 0, a, s, tmp.length);
 }  

 /**
  *
  * @param a
  * @param s
  * @param len
  *            每次归并的有序集合的长度
  */
 public static void mergeSort(int[] a, int s, int len) {  

  int size = a.length;
  int mid = size / (len << 1);
  int c = size & ((len<<1) - 1);  

  // -------归并到只剩一个有序集合的时候结束算法-------//
  if (mid == 0)
   return;  

  // ------进行一趟归并排序-------//
  for (int i = 0; i < mid; ++i) {
   s = i * 2 * len;
   merge(a, s, s + len, (len << 1) + s - 1);
  }  

  // -------将剩下的数和倒数一个有序集合归并-------//
  if (c != 0)
   merge(a, size - c - 2 * len, size - c, size - 1);
  //
  // for (int i = 0; i < a.length; ++i) {
  // System.out.print(a[i] + " ");
  // }
  // System.out.println();  

  // -------递归执行下一趟归并排序------//
  mergeSort(a, 0, 2 * len);
 }  

 public static void main(String[] args) throws InterruptedException {
    Thread m = new Thread(new MergeSort());
    Thread m1 = new Thread(m);
    Thread m2 = new Thread(m);
    Thread m3 = new Thread(m);
    Thread m4 = new Thread(m);
    Thread m5 = new Thread(m);

    //计时
      long startMili1=System.currentTimeMillis();// 当前时间对应的毫秒数
      System.out.println("总耗时为:"+(startMili1)+"毫秒");
      m1.start();
      m1.join();
      long endMili1=System.currentTimeMillis();
      System.out.println("总耗时为:"+(endMili1)+"毫秒");
      System.out.println("总耗时为:"+(endMili1-startMili1)+"毫秒n");

      long startMili2=System.currentTimeMillis();// 当前时间对应的毫秒数
      System.out.println("总耗时为:"+(startMili2)+"毫秒");
      m2.start();
      //m2.join();
      m3.start();
      //m3.join();
      m4.start();
      //m4.join();
      m5.start();
      //m5.join();
      long endMili2=System.currentTimeMillis();
      System.out.println("总耗时为:"+(endMili2)+"毫秒");
      System.out.println("总耗时为:"+(endMili2-startMili2)+"毫秒");
 }  

}

解决方案

什么对象??new和delete是成对出现的

解决方案二:

我猜你想问的是这些线程是否对同一个数组进行排序,答案是不是,是不同的数组。

你可能又会问,为什么每个线程我看到了相同的结果,我不是使用随机数么。答案是你使用的是伪随机数,你每个线程里都是用的是Random,没有使用不同的种子(seed),所以产生出来的是相同的数据。正确的做法:
1. JDK7及以上,用ThreadLocalRandom代替Random
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadLocalRandom.html
2. JDK7以下,使用不同的seed(申明一下,这种方法仍然可能产生重复的种子)
new Random(System.currentMillis());

时间: 2024-11-01 20:52:42

多线程-我这样是否对同一个对象进行了排序(小猿一只,评论勿留情)的相关文章

android-addView同一个对象两次会出错

问题描述 addView同一个对象两次会出错 //首页按钮 ImageView home=new ImageView(context); home.setImageResource(R.drawable.icon_03); home.setLayoutParams(iconparams); home.setPadding(10, 10, 10, 10); addView(home); //分隔符 ImageView seprator = new ImageView(context); sepra

javascript-Javascript怎样调用同一个对象内的方法?

问题描述 Javascript怎样调用同一个对象内的方法? Javascript对象的代码如下: var obj = { FunA: function () { alert("This is function FunA"); }, FunB: function () { var txtEles = $("text"); txtEles.each(function(){ //这里我想调用FunA,该怎么调用. }) } } 我想在方法FunB中注释的地方调用FunA,

HTML中的window对象和JavaScript中的window对象 是同一个对象么?

问题描述 HTML中的window对象和JavaScript中的window对象 是同一个对象么?知情的大哥大姐们,详细解释下 问题补充:Rainbow702 写道 解决方案 Window 对象表示浏览器中打开的窗口.window 是浏览器给创建的,每个载入浏览器的 HTML 文档都会成为 Document 对象浏览器打开了一个window,window里面放的是documentwindow 相当于全局变量存在于这个document中,documnet包含js,html之类,所以应该是一个对象.

为什么e和c指向的不是同一个对象??请高手做出解释,谢谢。。

问题描述 publicclassStringTest{publicstaticvoidmain(String[]args){Stringa="ab";System.out.println("Stringa="ab";");Stringb="cd";System.out.println("Stringb="cd";");Stringc="abcd";Stringd=&q

JavaScript对象数组的排序处理方法_javascript技巧

本文实例讲述了JavaScript对象数组的排序处理方法.分享给大家供大家参考,具体如下: javascript的数组排序函数 sort方法,默认是按照ASCII 字符顺序进行升序排列.arrayobj.sort(sortfunction); 参数:sortFunction 可选项.是用来确定元素顺序的函数的名称.如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列. sort 方法将 Array 对象进行适当的排序:在执行过程中并不会创建新的 Array 对象. 如果为 sor

java数组的排序 对象数组的排序 Comoarable接口实现 compareTo函数实现

 /*java 中数组的排序 对象数组 的排序基本类型的数组可以直接排序但是 引用类型的数组 不能直接排序 首先要实现 Comparable 接口并且重载compareTo方法 这个方法在  java.until包中的 Arrays 类 的  binarySearch() sort()进行排序和 查找  我们自定义的类进行排序  ,对象的搜索通过 binarySearch  但是这种搜索必须是排序号了的数组 String类 有 compareTo函数 可以直接进行比较 , */ import j

怎样实现多个线程监听同一个对象的事件?

问题描述 我想做一个这样的程序:有一个对对象A,当A里有一个message,有几个线程在同时监听着message值的改变.当message的值发生改变时,几个线程的事件监听模块被同时触发.请问这个程序怎么实现? 解决方案 解决方案二:忘了说一点,线程个数及名字不确定.解决方案三:怎么没有人理睬呢?解决方案四:委托usingSystem;namespacemyspace{classA{publicdelegatevoidCuttomHandler(stringmessage);publiceven

PowerPoint 2013为同一个对象依次应用不同动画效果的方法

  1.启动PowerPoint 2013并打开需要设置多个动画效果的幻灯片,在该幻灯片中选择需要添加动画的对象,然后为其添加第一个动画效果,如图1所示. 图1 添加第一个动画效果 2.在该对象被选择的情况下,再次单击"添加动画"按钮,在获得的下拉列表中选择需要添加的动画效果将其赋予对象,如图2所示.在"动画"选项卡"计时"组的"开始"下拉列表中将该动画效果的开始时间设置为"上一动画之后",如图3所示.这样

NHibernate中对同一个对象的Lazyload要设置一致

在NHibernate中出于性能的考虑,经常使用Lazyload的方式来加载关联的对象,关于什么是Lazyload,以及怎么使用,可以参见博客园中的文章,比如:http://www.cnblogs.com/lyj/archive/2008/10/28/1321494.html 常用NHibernate.ByteCode.Castle动态代理来实现Lazyload,使用该程序集会在运行时创建实体对应的代理类,如果实体使用了继承关系,并通过NHibernate来映射,那么动态代理类在类型转换时会有问