我的程序遇到了点问题,希望大家可以帮我看看
谢谢
/*功能:
 * 排序程序。
 * 先产生一个随机整数n(n>10),在产生n个随机数
 * 保存在数组里
 * 然后创建两个线程并发地对产生的随机数分别进行
 * 冒泡和快速排序
 * 最后比较排序的结果
 * 并输出先完成的排序线程
 * */
class Sorting 
{
public int []Sorting()
{
int n, i;
n = (int)(Math.random()*100);

while(n<=10)
n = (int)(Math.random()*100);
System.out.print("生成"+n+"个随机数为:");
int m_data[] = new int[n];
for(i = 0; i < n; i++)
{
m_data[i] = (int)(Math.random()*100);
System.out.print(m_data[i]+" ");
}
System.out.println();
return m_data;
}
}
class J_Experiment
{
//冒泡排序
public synchronized void Bubble_Sort(int a[])
{
int i, j, t; for(i = 1; i < a.length; i++)
{
for(j = 0; j < a.length - i; j++)
    {
        if(a[j] > a[j+1])
        {
             t = a[j+1];
             a[j+1] = a[j];
             a[j] = t;
        }
    }
}
System.out.print("冒泡排序完后的情况:");
for(i = 0; i < a.length; i++)
System.out.print(a[i]+" ");
}
//快速排序
public synchronized void Insert_sort(int b[])
{
    int i,j;
    int next;                   //标记要插入的数
    for(i = 1; i < b.length; i++)
    {
        next = b[i];
        for(j = i - 1; j >= 0 && next < b[j]; j--)
            b[j+1] = b[j];      //插入到比它小的数的后面
        b[j+1] = next;
    }
    System.out.print("快速排序完后的情况:");
for(i = 0; i < b.length; i++)
System.out.print(b[i]+" ");
}

}
class J_DoA extends Thread
{
J_Experiment dataA;
int m_data[];
public J_DoA(J_Experiment d, int a[])
{
dataA = d;
for(int i = 0; i < a.length; i++)
{
System.out.println(a[i]);
m_data[i] = a[i];
}
}
public void run()
{
dataA.Bubble_Sort(m_data);
}
}
class J_DoB extends Thread
{
J_Experiment dataB;
int m_data[];
public J_DoB(J_Experiment d, int b[])
{
dataB = d;
for(int i = 0; i < b.length; i++)
m_data[i] = b[i];
}
public void run()
{
dataB.Insert_sort(m_data);
}

}
public class J_Sorting
{
public static void main(String args[])
{
Sorting js = new Sorting();
J_Experiment data = new J_Experiment();
J_DoA threadA = new J_DoA(data, js.Sorting());
J_DoB threadB = new J_DoB(data, js.Sorting());
threadA.start();
threadB.start();
}
}

解决方案 »

  1.   

    package org.whatisjava.test;//我的程序遇到了点问题,希望大家可以帮我看看 
    //谢谢 
    /*功能: 
    * 排序程序。 
    * 先产生一个随机整数n(n>10),在产生n个随机数 
    * 保存在数组里 
    * 然后创建两个线程并发地对产生的随机数分别进行 
    * 冒泡和快速排序 
    * 最后比较排序的结果 
    * 并输出先完成的排序线程 
    * */ 
    class Sorting 

    public int[] Sorting() 

    int n, i; 
    n = (int)(Math.random()*100); while(n <=10) 
    n = (int)(Math.random()*100); 
    System.out.print("生成"+n+"个随机数为:"); 
    int m_data[] = new int[n]; 
    for(i = 0; i < n; i++) 

    m_data[i] = (int)(Math.random()*100); 
    System.out.print(m_data[i]+" "); 

    System.out.println(); 
    return m_data; 


    class J_Experiment 

    //冒泡排序 
    public synchronized void Bubble_Sort(int a[]) 

    int i, j, t; for(i = 1; i < a.length; i++) 

    for(j = 0; j < a.length - i; j++) 
        { 
            if(a[j] > a[j+1]) 
            { 
                t = a[j+1]; 
                a[j+1] = a[j]; 
                a[j] = t; 
            } 
        } 

    System.out.print("冒泡排序完后的情况:"); 
    for(i = 0; i < a.length; i++) 
    System.out.print(a[i]+" "); 

    //快速排序 
    public synchronized void Insert_sort(int b[]) 

        int i,j; 
        int next;                  //标记要插入的数 
        for(i = 1; i < b.length; i++) 
        { 
            next = b[i]; 
            for(j = i - 1; j >= 0 && next < b[j]; j--) 
                b[j+1] = b[j];      //插入到比它小的数的后面 
            b[j+1] = next; 
        } 
        System.out.print("快速排序完后的情况:"); 
    for(i = 0; i < b.length; i++) 
    System.out.print(b[i]+" "); 
    } } 
    class J_DoA extends Thread 

    J_Experiment dataA; 
    int m_data[]; //1、此处m_data为未初始化数组
    public J_DoA(J_Experiment d, int a[]) 

    dataA = d;
    m_data = a;//2、初始化数组m_data
    /*
    for(int i = 0; i < a.length; i++) 

    System.out.println(a[i]); 
    m_data[i] = a[i]; //若2处语句不写直接执行该for循环将报空指针异常
    }
    */ 

    public void run() 

    dataA.Bubble_Sort(m_data); 


    class J_DoB extends Thread 

    J_Experiment dataB; 
    int m_data[]; 
    public J_DoB(J_Experiment d, int b[]) 

    dataB = d; 
    m_data=b;
    /*for(int i = 0; i < b.length; i++) 
    m_data[i] = b[i]; 
    }*/ 
    public void run() 

    dataB.Insert_sort(m_data); 
    } } 
    public class J_Sorting 

    public static void main(String args[]) 

    Sorting js = new Sorting(); 
    J_Experiment data = new J_Experiment(); 
    J_DoA threadA = new J_DoA(data, js.Sorting()); 
    J_DoB threadB = new J_DoB(data, js.Sorting()); 
    threadA.start(); 
    threadB.start(); 

    }
      

  2.   

    懂了。谢谢您哦。不过那个比较两个线程的时间的?我用
    Date date = new Date();
    long s1 = date.getTime();
    怎么都不可以达到想要的结果?
    请问可否提点下呢?
      

  3.   

    不是那样的
    两个线程也不可能同时开始操作系统在处理线程的时候
    线程A,B"同时运行"
    当A运行之中很可能停下来等一等B
    B在运行的时候也很可能停下来等一等A
    所以这样计算的时间根本不准确
    两个线程之间必然有相互的影响这些都是操作系统对线程的管理和当前CPU的情况决定的
    不可以这样计算 两种排序所用的时间
    因为这样计算好之后的时间里还有两个线程之间相互等待的时间当然...你用双核CPU可以做到同时运行的效果..每个CPU运行一个线程
    但是也有很大的误差...而且...JAVA对多核CPU的处理并不好
      

  4.   

    不是用synchronized方法就可以解决的吗?
      

  5.   

    运....那是解决不能同时用一个对象的问题...你synchronized之后
    另一个线程暂停了..但是系统时间仍然在涨啊!!!!!如果你是想 第一个线程完成之后第二个线程在执行的话...还用多线程做什么