当前位置:编程学习 > JAVA >>

java线程问题

--------------------编程问答-------------------- 在线坐等解疑 --------------------编程问答-------------------- 让主线程睡眠试试 --------------------编程问答--------------------
引用 2 楼 a1023783623 的回复:
让主线程睡眠试试

如果等待的线程不是5个而是5万,是不是要用while(ture)来运行主线程? --------------------编程问答-------------------- 不是用它来运行主线程,单独把他拿出来再while(ture) --------------------编程问答--------------------
 try {                    Thread.sleep(65);                    ;                    System.out.println("队列已满:"                            + Thread.currentThread().getName() + "等待中");                } catch (InterruptedException e) {                    e.printStackTrace();                }

走完这个分支,你这个线程就结束了,如果需要,在这里应该是有个while(true)循环,并且有控制当前活跃线程的计数器,当计数器中的执行线程少于10个时,再继续执行这个线程,否则线程等待。 --------------------编程问答-------------------- 主线程for循环15次,很快就结束了,main线程就会结束,根本不会等你线程运行65秒后结束1线程,运行11个线程。将for循环替换成while(true),在while(true){ 加15个线程的执行过程} --------------------编程问答-------------------- 完全按照你的代码执行,运行结果:

当前队列执行数Run:0
第0运行
第0正在执行操作
60秒后中断IT接口连接
当前队列执行数Run:2
第2运行
第2正在执行操作
60秒后中断IT接口连接
当前队列执行数Run:1
第1运行
第1正在执行操作
60秒后中断IT接口连接
当前队列执行数Run:3
当前队列执行数Run:9
第7运行
当前队列执行数Run:8
第5运行
第5正在执行操作
60秒后中断IT接口连接
当前队列执行数Run:8
第6运行
第6正在执行操作
60秒后中断IT接口连接
当前队列执行数Run:7
第4运行
第4正在执行操作
60秒后中断IT接口连接
第3运行
第3正在执行操作
60秒后中断IT接口连接
第7正在执行操作
60秒后中断IT接口连接
当前队列执行数Run:10
当前队列执行数Run:11
当前队列执行数Run:12
当前队列执行数Run:13
当前队列执行数Run:12
当前队列执行数Run:14
当前队列执行数Run:14
队列已满:第9等待中
队列已满:第8等待中
队列已满:第10等待中
队列已满:第11等待中
队列已满:第12等待中
队列已满:第13等待中
队列已满:第14等待中

也就是说,后面5个也是运行了的,只是你的判断:if (ThreadRunNo >= ThreadSum)...导致这个线程没有加入Timer。
你的问题不是main方法,而是线程设计的问题,这个if,不太清楚你想做什么。 --------------------编程问答-------------------- 线程不是这么玩的,单任务队列你直接丢到Timer里就可以帮你排队;
对于多线程并发的队列,你可以参考java.util.concurrent包,关于线程池的部分; --------------------编程问答-------------------- 1.头10个线程不满足
if (ThreadRunNo >= ThreadSum)
判断进入了ELSE,开始了Timer60秒等待,这里可以理解为你在这Sleep了600000毫秒。60秒后线程结束。

2.接下的5个线程满足
if (ThreadRunNo >= ThreadSum)
,在Sleep了65毫秒后,打印了"队列已满:XX等待中",线程结束。这里你想要线程进入等待,完全没有实现。

你给了10个Runing的线程名额,前十个开启的线程占用了这10个名额并持续60秒。而你之后开启的5个线程因为名额被占用进入了你所谓的等待流程,在65毫秒后线程就结束运行了。

if (ThreadRunNo >= ThreadSum) {
                try {
                    Thread.sleep(65);
                    ;
                    System.out.println("队列已满:"
                            + Thread.currentThread().getName() + "等待中");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println(Thread.currentThread().getName() + "运行");
                System.out.println(Thread.currentThread().getName() + "正在执行操作");
                System.out.println("60秒后中断IT接口连接");
                Timer timer = new Timer();
                timer.schedule(new TimerTest(), 60000);
            }

放入while(true){}中
然后
1.在Timer结束后要跳出这个While,让这个这个线程结束。
2.修改if (ThreadRunNo >= ThreadSum)判断,或者动态修正ThreadRunNo的值。因为你在构造函数里设了这个 值之后就一直没有修改过。你创建的所有线程从开始到结束ThreadRunNo不会改变。不满足ThreadRunNo >= ThreadSum条件的线程永远也不会满足这个判断。

建议看看线程池。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,