永发信息网

java 多线程并发请求数据,只要有一条线程获得数据,则其他线程终止运行,并打印出获得的数据

答案:3  悬赏:0  手机版
解决时间 2021-03-27 15:15
java 多线程并发请求数据,只要有一条线程获得数据,则其他线程终止运行,并打印出获得的数据
最佳答案
这边我写了一个例子,两个线程同时获取随机数,当获取的值为68的时候则停止所有进程。

这是目录结构:MyThreadOne和MyThreadTwo是两个线程,TestMain是主函数,MyThread继承Thread类。

MyThread.java

package com.xsx.test;

public class MyThread extends Thread {
public void stopThread() {}
}MyThreadOne.java
package com.xsx.test;
import java.util.Random;


public class MyThreadOne extends MyThread{

private boolean isOK = true;
Random random = new Random();//演示

public void stopThread() {
this.isOK = false;
}

@Override
public void run() {
while(isOK) {
int x = random.nextInt(10000);
System.out.println("Thread One: " + x);
if(x == 68) {
TestMain.stopAll();
System.out.println("My Value is " + x);
break;
}
}
//这边你结合自己的逻辑来写,总之,是通过isOK来控制线程的
}
}MyThreadTwo.java
package com.xsx.test;
import java.util.Random;

public class MyThreadTwo extends MyThread {

private boolean isOK = true;
Random random = new Random();//演示

public void stopThread() {
this.isOK = false;
}

@Override
public void run() {
while(isOK) {
int x = random.nextInt(10000);
System.out.println("Thread Two: " + x);
if(x == 68) {
TestMain.stopAll();
System.out.println("My Value is " + x);
break;
}
}
}

}TestMain.java
package com.xsx.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


public class TestMain {

public static Map threadPool = new HashMap();//定义一个线程池


public static void stopAll() {
Iterator threads = threadPool.values().iterator();
while(threads.hasNext()) {
threads.next().stopThread();
}
threadPool.clear();
}

public static void main(String[] args) {
//实例化两个线程获取到随机数为68时就停止进程,并输出
MyThread thread1 = new MyThreadOne();//实例化线程1
MyThread thread2 = new MyThreadTwo();//实例化线程2
threadPool.put("thread1", thread1);//将线程1放入线程池中
threadPool.put("thread2", thread2);//将线程2放入线程池中
thread1.start();//运行
thread2.start();
}
}项目已经打包上传

全部回答
你可以设置一个synchronized 的全局变量 ,当有一个获取数据成功就改变这个全局变量的值。如果其他线程发现值变了就终止不就可以了么?你那个notify去通知 是不行的。你可以好好看一下notify的作用。追问谢谢您,按你的方法可以贴出代码我看下效果吗??追答
上面也是用标志位来终端线程。我写了个强制关闭的,但是你的请求时间太短看不出效果。多运行几遍就能感受到和上面的不同之处。


你这个错误太多了。追问可以帮忙指定吗?谢谢追答1、线程的执行顺序是随机的,所以没有一定正确的结果。
2、在获取数据后没有通知其他线程中止,只是通知了主线程继续执行。追问1、结果只是举个例子而以,不一定就是这个结果
2、因为不知道怎么通知其他线程中止运行,才向大家请教,嘻嘻。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
关于串口通信完成机器人的激光测距仪数据的收
《会计考题》甲企业2012年1月20日购买a公司发
用鸡蛋烫瘀伤要去鸡蛋壳吗?
意博电脑地址在哪,我要去那里办事,
选出下列表述有错误的一项(2分)A. 《诗经》
若集合A={x|x2+x-6=0}B={x|x2+x+a=0},且B含于
千年怎么成立门派
留存收益按用途不同 可以分为()()谢谢
梦见粉红色的马是什么意思
求电视剧青盲大结局过雷区时的背景音乐
部落冲突13本长什么样
On his way to the airport,it him all of a
宏陶陶瓷(建设中路)地址在哪,我要去那里办事
log4(3)+log8(3) 怎么算的
魔女之泉3莫雷尔神殿门怎么开启
推荐资讯
传感器尺寸23.5×15.6mm 与1/2英寸的哪个
英雄联盟解封器 lol封号免费解封器
It is the third time that Susan late to w
单选题One of the methods o
出门,归身,白虎,青龙在字花会各代表什么意
龙跃文学《2519》是什么书名?有知道的麻烦告
作文中的顺势插入式是什么意思
诛法在佛学里的解释
昨天的薄荷叶水今天还能喝吗
六十岁老人转弯有就迷路什么征
三四之二猜一数字?
清代通史读后感500字
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?