多线程:N个同时执行,只要有一个成功就继续

htcyrylcmj0415 2018-10-02 05:55:17
有撒优雅实现方式吗?
...全文
912 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
htcyrylcmj0415 2018-10-16
  • 打赏
  • 举报
回复
傻逼了,忘记了可以在线程循环一直确认状态 感谢搂上各位
十八道胡同 2018-10-14
  • 打赏
  • 举报
回复
"C:\Program Files\Java\jdk1.8.0_121\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=16188:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;D:\Java\workspace\ThreadDemo\thread01\target\classes" com.demo.thread01
hh
线程6完成10%
线程1完成10%
线程8完成10%
线程9完成10%
线程2完成10%
线程9完成20%
线程7完成10%
线程4完成10%
线程3完成10%
线程0完成10%
线程1完成20%
线程5完成10%
完成线程的个数是:0
线程5完成20%
线程5完成30%
线程8完成20%
线程1完成30%
线程2完成20%
线程0完成20%
线程6完成20%
线程4完成20%
完成线程的个数是:0
线程9完成30%
线程3完成20%
线程0完成30%
线程7完成20%
完成线程的个数是:0
线程2完成30%
线程7完成30%
线程3完成30%
线程2完成40%
完成线程的个数是:0
线程2完成50%
线程8完成30%
线程1完成40%
线程4完成30%
线程5完成40%
线程6完成30%
线程9完成40%
完成线程的个数是:0
线程1完成50%
线程0完成40%
完成线程的个数是:0
线程6完成40%
线程2完成60%
线程3完成40%
完成线程的个数是:0
线程4完成40%
线程7完成40%
线程8完成40%
完成线程的个数是:0
线程4完成50%
线程0完成50%
线程5完成50%
完成线程的个数是:0
线程7完成50%
线程6完成50%
线程9完成50%
完成线程的个数是:0
线程5完成60%
线程2完成70%
线程3完成50%
完成线程的个数是:0
线程5完成70%
线程1完成60%
线程1完成70%
线程5完成80%
线程0完成60%
线程8完成50%
完成线程的个数是:0
线程1完成80%
线程6完成60%
完成线程的个数是:0
线程8完成60%
线程9完成60%
线程6完成70%
线程8完成70%
线程4完成60%
线程6完成80%
完成线程的个数是:0
线程4完成70%
线程9完成70%
线程7完成60%
线程3完成60%
完成线程的个数是:0
线程9完成80%
完成线程的个数是:0
线程0完成70%
完成线程的个数是:0
线程2完成80%
线程9完成90%
线程8完成80%
线程5完成90%
完成线程的个数是:0
线程9完成100%
线程1完成90%
线程4完成80%
完成线程的个数是:1
线程5完成100%
线程2完成90%
线程3完成70%
完成线程的个数是:2
线程7完成70%
完成线程的个数是:2
线程1完成100%
线程3完成80%
完成线程的个数是:3
线程6完成90%
线程8完成90%
线程2完成100%
完成线程的个数是:4
线程8完成100%
完成线程的个数是:5
线程0完成80%
线程7完成80%
线程0完成90%
完成线程的个数是:5
线程4完成90%
完成线程的个数是:5
线程3完成90%
线程6完成100%
线程4完成100%
完成线程的个数是:7
完成线程的个数是:7
完成线程的个数是:7
完成线程的个数是:7
完成线程的个数是:7
完成线程的个数是:7
线程7完成90%
完成线程的个数是:7
线程0完成100%
线程3完成100%
完成线程的个数是:9
完成线程的个数是:9
完成线程的个数是:9
完成线程的个数是:9
完成线程的个数是:9
完成线程的个数是:9
完成线程的个数是:9
完成线程的个数是:9
完成线程的个数是:9
线程7完成100%
完成线程的个数是:10

Process finished with exit code 0

执行结果
十八道胡同 2018-10-14
  • 打赏
  • 举报
回复
package com.demo;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class thread01 {

Map<Integer, Integer> controlMap = Collections.synchronizedMap(new HashMap<Integer, Integer>());

public static void main(String[] args) {
System.out.println("hh");
new thread01().TestDemo();
}

public void TestDemo() {
for (Integer i = 0; i < 10; i++) //初始化状态
{
controlMap.put(i, 0);
Thread t1 = new Thread(new subThread(i));
t1.start();
}

Integer complateCount = 0;
while (complateCount < 10) {
try {
Thread.sleep(1000 * 1);//等待1s看结果
complateCount = 0;
for (Integer i = 0; i < 10; i++) {
if (controlMap.get(i) == 100) {
complateCount++;
}
}
System.out.println("完成线程的个数是:" + complateCount);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

private class subThread implements Runnable {
private Integer threadControlId;

public subThread(Integer id) {
threadControlId = id;
}

public void run() {
for (Integer i = 1; i <= 10; i++)//线程内模拟耗时任务
{
try {
Thread.sleep((long) (1000 * (i * Math.random())));
controlMap.put(threadControlId, i * 10);//100代表完成
System.out.println("线程" + threadControlId + "完成" + i * 10 + "%");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}
}
十八道胡同 2018-10-13
  • 打赏
  • 举报
回复
N个线程对应N个线程安全的变量,每个线程执行过程中实时更新自己对应的那个变量。

这样主线程可以实时获取每个线程执行的状态
htcyrylcmj0415 2018-10-13
  • 打赏
  • 举报
回复
引用 1 楼 mj280824108 的回复:
这很简单,定义一个集合变量,作为确认指针,程序未执行就为空,程序执行后没有成功就为0,有线程执行成功,就是1,然后在线程中对这个确认指针做相关的判断和对应的逻辑就可以了。
主线程怎么实时获取状态呢?
htcyrylcmj0415 2018-10-13
  • 打赏
  • 举报
回复
引用 3 楼 LCL_data 的回复:
N个线程对应N个线程安全的变量,每个线程执行过程中实时更新自己对应的那个变量。 这样主线程可以实时获取每个线程执行的状态
引用 4 楼 mj280824108 的回复:
[quote=引用 2 楼 htcyrylcmj0415 的回复:] [quote=引用 1 楼 mj280824108 的回复:] 这很简单,定义一个集合变量,作为确认指针,程序未执行就为空,程序执行后没有成功就为0,有线程执行成功,就是1,然后在线程中对这个确认指针做相关的判断和对应的逻辑就可以了。
主线程怎么实时获取状态呢?[/quote] 打个比方,静态变量知道把,初始化的时候就会在内存中,定义一个静态变量指针,作为全局线程的控制[/quote] 怎么在入口方法检测那个用于存储状态的对象呢? 又不知道子线程什么时候更新了状态,肯定要定时轮询检测状态的吧?
Enchanter, 2018-10-13
  • 打赏
  • 举报
回复
引用 2 楼 htcyrylcmj0415 的回复:
[quote=引用 1 楼 mj280824108 的回复:]
这很简单,定义一个集合变量,作为确认指针,程序未执行就为空,程序执行后没有成功就为0,有线程执行成功,就是1,然后在线程中对这个确认指针做相关的判断和对应的逻辑就可以了。

主线程怎么实时获取状态呢?[/quote]

打个比方,静态变量知道把,初始化的时候就会在内存中,定义一个静态变量指针,作为全局线程的控制
Enchanter, 2018-10-08
  • 打赏
  • 举报
回复
这很简单,定义一个集合变量,作为确认指针,程序未执行就为空,程序执行后没有成功就为0,有线程执行成功,就是1,然后在线程中对这个确认指针做相关的判断和对应的逻辑就可以了。

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧