一个java多线程问题

2025-04-16 18:41:45
推荐回答(3个)
回答1:

程序没有问题,是random的问题,随机生成的数,多执行几次就可以看到结果,不信的话,你可以把数组改为依次从0递增到100000.你就会发现每次都会有一个等于555。如果一定要用随机数组的话,没关系多运行几次,运气好的话,能看到的。我亲自试过

回答2:

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);// 打印相同数字的下标
}
}

回答3:

应该是你new了那么多的j2ee他们的z不是共享的