小弟使用多条线程并发请求数据,想实现 只要有一条线程获得数据,其他线程就终止运行 的功能,但不知道怎么控制其他线程终止运行,请各位大神帮忙下下,代码如下:
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
这边我写了一个例子,两个线程同时获取随机数,当获取的值为68的时候则停止所有进程。
这是目录结构:MyThreadOne和MyThreadTwo是两个线程,TestMain是主函数,MyThread继承Thread类。
MyThread.java
MyThreadOne.java
package com.xsx.test;MyThreadTwo.java
package com.xsx.test;TestMain.java
package com.xsx.test;项目已经打包上传
谢谢您,按你的方法可以贴出代码我看下效果吗??
追答上面也是用标志位来终端线程。我写了个强制关闭的,但是你的请求时间太短看不出效果。多运行几遍就能感受到和上面的不同之处。
可以帮忙指定吗?谢谢
追答1、线程的执行顺序是随机的,所以没有一定正确的结果。
2、在获取数据后没有通知其他线程中止,只是通知了主线程继续执行。
1、结果只是举个例子而以,不一定就是这个结果
2、因为不知道怎么通知其他线程中止运行,才向大家请教,嘻嘻。。。
java多线程开发的同步机制有哪些
可见性要更加复杂一些,documents它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题小结:为了防止多个线程并发对同一数据的修改,所以需要同步,否则会造成数据不一致(就是...