BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #23444同步于 2012/9/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[问]死循环 & 多线程计时

NagatoYuki
2012/9/12镜像同步8 回复
死循环: while(true){ System.out.print("XXX"); } 运行的时候,为什么不执行输出语句呢? ---- 多线程计时: main(){ getStartTime() ; Thread t1,t2,t3...start(); //多线程运行 endTime-startTime; } 如何在不影响多线程并行执行的情况下,让main函数的主线程最后结束,计算中间运行时间。
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
wks机器人#1 · 2012/9/12
1. 和缓冲有关。 2. for (Thread t : new Thread[] {t1,t2,t3,...,tn}) { t.join(); }
Neuron机器人#2 · 2012/9/13
【 在 wks 的大作中提到: 】 : 1. 和缓冲有关。 : 2. : [code=java] : ................... 第二个会不会是串行执行了
wks机器人#3 · 2012/9/13
执行是并行的,等待是串行的。但是,既然要等到所有的线程结束,以什么顺序等待又有什么关系呢? 【 在 Neuron 的大作中提到: 】 : 第二个会不会是串行执行了
Neuron机器人#4 · 2012/9/13
【 在 wks 的大作中提到: 】 : 执行是并行的,等待是串行的。但是,既然要等到所有的线程结束,以什么顺序等待又有什么关系呢? : 我不清楚java的多线程机制,但是这个代码如果放在c 的pthread的话,是串行执行,就是启动一个线程,等待这个线程结束后,才再启动第二个线程,再等待第二线程结束…… 所以我很好奇这段代码在java是不是并行的
wks机器人#5 · 2012/9/13
想象一下,如果没有这些join,那么那些线程就应该并发执行吧? 那么在所有的线程都start了,但是main线程还没有开始join的这个缝隙中,其它线程是不是并发执行的呢?想象在这个for(...){t.join}之前还有个Thread.sleep(10000),这段时间是不是并发的呢? 所以添加一段join不可能让本来该并行的变成串行。 【 在 Neuron 的大作中提到: 】 : 我不清楚java的多线程机制,但是这个代码如果放在c 的pthread的话,是串行执行,就是启动一个线程,等待这个线程结束后,才再启动第二个线程,再等待第二线程结束…… : 所以我很好奇这段代码在java是不是并行的
Neuron机器人#6 · 2012/9/13
【 在 wks 的大作中提到: 】 : 想象一下,如果没有这些join,那么那些线程就应该并发执行吧? : 那么在所有的线程都start了,但是main线程还没有开始join的这个缝隙中,其它线程是不是并发执行的呢?想象在这个for(...){t.join}之前还有个Thread.sleep(10000),这段时间是不是并发的呢? : 所以添加一段join不可能让本来该并行的变成串行。 : ................... for代码那段是不是先执行new一个线程,然后执行代码块中的t.join() t.join()在java里,有没有阻塞功能 还是说你给的那段代码里,for语句会先把所有的线程都new起来,然后再挨个执行t.join()
wks机器人#7 · 2012/9/13
package com.github.wks.javajunks; public class ThreadsTest { private static class Printer implements Runnable { private int i; public Printer(int i) { this.i = i; } @Override public void run() { System.out.println(i); } } public static void main(String[] args) throws InterruptedException { Thread[] ts = new Thread[10]; for (int i = 0; i < 10; i++) { ts[i] = new Thread(new Printer(i)); } System.out.println("Starting..."); for (Thread t : ts) { t.start(); } System.out.println("All started. Joining..."); for (Thread t : ts) { t.join(); } System.out.println("Main end."); } } 【 在 Neuron 的大作中提到: 】 : for代码那段是不是先执行new一个线程,然后执行代码块中的t.join() : t.join()在java里,有没有阻塞功能 : 还是说你给的那段代码里,for语句会先把所有的线程都new起来,然后再挨个执行t.join()
greedisgood机器人#8 · 2012/9/13
第二题的标准答案是锁存器CountDownLatch吧 main(){ getStartTime() ; CountDownLatch cdl=new CountDownLatch(n)//n个线程的 Thread t1,t2,t3...start(); //多线程运行,其中每个run最后一句调用cdl.countDown(); cdl.await();//主线程在这行阻塞,直到所有线程结束。 endTime-startTime; }