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

小弟使用多条线程并发请求数据,想实现只要有一条线程获得数据,其他线程就终止运行的功能,但不知道怎么控制其他线程终止运行,请各位大神帮忙下下,代码如下:packagetes... 小弟使用多条线程并发请求数据,想实现 只要有一条线程获得数据,其他线程就终止运行 的功能,但不知道怎么控制其他线程终止运行,请各位大神帮忙下下,代码如下:

package test;
public class ThreadTest implements Runnable{
//请求获得的数据
public String reqDate = null;

public static void main(String[] args) {
ThreadTest t = new ThreadTest();
new Thread(t,"线程1").start();
new Thread(t,"线程2").start();
new Thread(t,"线程3").start();
new Thread(t,"线程4").start();
new Thread(t,"线程5").start();
new Thread(t,"线程6").start();

String resultDate = t.getReqDate();
System.out.println("请求数据为:"+resultDate);
}

//获得数据,没有数据则等待
public synchronized String getReqDate(){
try {
if(reqDate == null){
wait();
}
} catch (Exception e) {
e.printStackTrace();
}
return reqDate;
}

//如果其他线程都未获得数据,则把请求所得数据赋值给reqDate,并通知其它线程停止数据请求
public synchronized void setReqDate(String date){
if(reqDate == null){
this.reqDate = date;
}
notify();
}

@Override
public void run() {
try {
for(int i = 0;i<30;i++){

System.out.println(i+": "+Thread.currentThread().getName()+"正在请求数据...."+reqDate);
if(i ==10){//如果已经获得数据,则不在发送请求
String date ="K9081";
System.out.println(i+": "+Thread.currentThread().getName()+"已获得数据:"+date);
setReqDate(date);
break;
}
Thread.sleep(3000);
}
} catch (Exception e) {
System.out.println(Thread.currentThread().getName() + " interrupted.");
}

}

}

以上代码的执行结果是(错误结果):
10: 线程5正在请求数据....null
10: 线程4正在请求数据....null
10: 线程4已获得数据:K9081
10: 线程6正在请求数据....null
10: 线程1正在请求数据....K9081
请求数据为:K9081
10: 线程5已获得数据:K9081
10: 线程3正在请求数据....K9081
10: 线程3已获得数据:K9081
10: 线程1已获得数据:K9081
10: 线程2正在请求数据....K9081
10: 线程2已获得数据:K9081
10: 线程6已获得数据:K9081
正确结果应该是:
10: 线程5正在请求数据....null
10: 线程5已获得数据:K9081
请求数据为:K9081
展开
 我来答
百度网友13b7853
推荐于2018-03-21 · 超过10用户采纳过TA的回答
知道答主
回答量:17
采纳率:0%
帮助的人:14.6万
展开全部

这边我写了一个例子,两个线程同时获取随机数,当获取的值为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<String, MyThread> threadPool = new HashMap<String, MyThread>();//定义一个线程池

/***
 * 终止所有线程
 */
public static void stopAll() {
Iterator<MyThread> 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();
}
}

项目已经打包上传

韩家_四少
2013-08-07 · 超过24用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:58.9万
展开全部
你可以设置一个synchronized 的全局变量 ,当有一个获取数据成功就改变这个全局变量的值。如果其他线程发现值变了就终止不就可以了么?你那个notify去通知 是不行的。你可以好好看一下notify的作用。
追问
谢谢您,按你的方法可以贴出代码我看下效果吗??
追答

上面也是用标志位来终端线程。我写了个强制关闭的,但是你的请求时间太短看不出效果。多运行几遍就能感受到和上面的不同之处。


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
路亚向前冲8t
2013-08-07 · TA获得超过484个赞
知道小有建树答主
回答量:636
采纳率:0%
帮助的人:438万
展开全部
你这个错误太多了。
更多追问追答
追问
可以帮忙指定吗?谢谢
追答
1、线程的执行顺序是随机的,所以没有一定正确的结果。
2、在获取数据后没有通知其他线程中止,只是通知了主线程继续执行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式