碰到一个Java多线程问题,求大神解答,代码如下:

2024-11-03 05:36:26
推荐回答(1个)
回答1:

/*
刚才看了你的题目,回答你这个题目之前先回说下:
你题目大意,随机一个数字出来,这个数满足比4大就可以了,
你题目说让用多线程,拿到合格数,限制300ms,这很难办到,通俗点打个比方
你让一群人下河去抓鱼,要求抓到,一个5斤重的鱼就算目标达成,你若用多线程,并发时候
好比每个人都在抓各自的,这就导致了有快也有慢,但是你要是说,所有人抓的鱼共5斤这个才
是多线程的优势!
这和当前CPU状态有直接关系:我刚才用20条线程并发测试了一下:
最好的时候:(最快180+,最慢达到1000+)
最差的时候:(最快700+,最慢达到3000+);
注意,我每条线程,每计算一次都让暂停180毫秒了的!按照你的要求在走的!
如果我计算之前每条线程只暂停一次,那么将会快很多!好了,废话结束,看代码!
*/
public class ThreadTest {
static int k = 4;
static boolean flag = false;
public static void main(String[] args) throws InterruptedException {
Thread[] arr = new Thread[20];
StringBuffer stb = new StringBuffer("------------------------\n");
ThreadGroup tg = new ThreadGroup("");
for (int i = 0; i < 20; i++) {
arr[i] = new Thread(tg, "线程" + (i + 1)) {
int i = 0,a=-1;
public void run() {
String str = "";
if (a <= k) {
str = Thread.currentThread().getName() + "耗时:" + time();
stb.append(str + "\n");
Thread.currentThread().interrupt();
} else {
return;
}
}
private synchronized long time() {
if (a > k) {
Thread.interrupted();
return -1;
}
long start = System.currentTimeMillis();

while (a <= k || flag == false) {
while (a <= k) {
i++;
try {
Thread.sleep(180);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (a > k)
return System.currentTimeMillis() - start;//休眠后判断一次!
a = number();
System.out.println(Thread.currentThread().getName() + "第" + (i) + "次a:==>" + a);
}
flag = true;
System.out.println(Thread.currentThread().getName() + "第" + (i) + "次:获得理想值" + a);
return System.currentTimeMillis() - start;
}
return System.currentTimeMillis() - start;
}

private int number() {
int a = (int) (Math.random() * 6);
return a;
}
};
}
for (Thread a : arr) {
a.start();
}
for (Thread a : arr) {
try {
a.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(stb);
System.out.println("Over!");
}
}

注意我,采用的是静态变量!

补充下:多线程真的很难控制!