永发信息网

一个新手关于java的问题

答案:1  悬赏:0  手机版
解决时间 2021-12-19 09:02
  • 提问者网友:刺鸟
  • 2021-12-19 05:07
题目:
多线程并发顺序查找
定义并创建1个100000个元素的整型数组
产生0~999随机数填充数组
用5个线程将数组均分为5块,分别顺序查找各范围内等于X的所有元素下标
在主线程(主函数)中输出所有下标,并统计输出等于X的元素个数

下面是我自己编写的代码;
package com.test1;
import java.util.*;
public class Demo_1{
//创建1个100000个元素的整型数组
int intArray[] =new int[100000];
//实例化一个random类
Random random= new Random();
//主类的构造函数,将1000个0~999的随机数放进intArray数组中
public Demo_1(){
for(int i = 0;i<1000;i++)
intArray[i]=random.nextInt(1000);
}
//主函数
public static void main(String[] args){
Demo_1 demo_1= new Demo_1();
Random_1 random_1= new Random_1(200);
random_1.start();

}
}
//准备实现第一个线程
class Random_1 extends Thread
{
//x是要查找的数字,我让所有查找到的数字的下标组成一个数组,j是该数组的下标
int j=0,x=0;
int[] XArray=new int[200];
Demo_1 a =new Demo_1();
//Random_1的构造函数
public Random_1(int x){
this.x=x;
}
//跑线程
public void run() {
System.out.println("这是第一个线程,找到"+x+"的下标有:");
for(int i=0;i<200;i++){
if(a.intArray[i]==x){
XArray[j]=i;
j++;
}
}
for(int m=0;m System.out.print(XArray[m]+" ");
System.out.println();
System.out.println("总共有"+j+"个"+x);
}
}
}

希望大神们能帮我看看问题所在,我得不出想要的答案,不知道是哪里错了
最佳答案
  • 五星知识达人网友:玩家
  • 2021-12-19 06:05
我手上有这个程序
import java.util.ArrayList;
import java.util.Random;

class PP {
static int a[] = init(10000); // 初始化数组、元素赋值、设置数组大小

static int[] init(int n) {
Random rand = new Random();
int t[] = new int[n];
for (int i = 0; i < n; i++) {
// t[i] = 5; // 试验使用
 t[i] = rand.nextInt(1000); // 数字范围0~999
}
return t;
}
}

public class J2ee extends PP implements Runnable {
int count = 0; // 相同元素的统计
int threads = 0; // 线程数量,用来统计退出几个线程
int group; // 分组数量
int search; // 查找内容
int c;
ArrayList index = new ArrayList(); // 用来存储下标

public void setGroup(int group) { // 设置分组的个数
this.group = group;
c = a.length / group; // 每个小组的平均个数,这有点小问题,需要考虑101/5,不能均分的情况,待解决
}

public void setSearch(int search) { // 设置查找的内容
this.search = search;
}

@Override
public void run() {
int gc = Integer.parseInt(Thread.currentThread().getName()); // 利用线程的名称,将数组分成若干小组
for (int i = c * gc; i < c * (gc + 1); i++) { // 每个线程通过名称获得分配的数组区间

synchronized (this) {                     //不加同步会出问题
if (a[i] == search) {
index.add(i); // 将数组下标放置到ArrayList中
count++; // 相同元素个数的累加
}
}
}
synchronized (this) {
threads++; // 线程结束个数 ,每个线程退出时thread加1;
}
}

public static void main(String args[]) {
J2ee r = new J2ee();
Thread[] t = new Thread[5];
r.setGroup(t.length); // 设置元素的分组数量
r.setSearch(555); // 设置要查找的数字555
for (int i = 0; i < t.length; i++) {
t[i] = new Thread(r, "" + i); // 用同一个Runnable构造线程,并用数字命名,名称有特殊用处,只能是数字
t[i].start();
}

while (r.threads != t.length) { // 已经结束的线程数量 != 线程组的数量,主线程循环等待
} // 线程组全部结束,循环退出
// Collections.sort(r.index);
// System.out.println(Arrays.toString(a)); // 打印数组内容
System.out.printf("与%s值相等的数有%s个\n", r.search, r.count);
System.out.println(r.index);// 打印相同数字的下标
}
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯