用于循环线程的Java(几乎同时)

时间:2015-04-09 10:05:16

标签: java multithreading

使用此代码:

 final CyclicBarrier gate = new CyclicBarrier(2);

    Thread t1 = new Thread() {
        public void run() {
            try {
                gate.await();
                for (int i = 0; i < 1000; i++) {
                    System.out.println("F1:" + i);
                }
            } catch (InterruptedException | BrokenBarrierException ex) {
                Logger.getLogger(TestFor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    };
    Thread t2 = new Thread() {
        public void run() {
            try {
                gate.await();
                for (int i = 0; i < 1000; i++) {
                    System.out.println("F2:" + i);
                }
            } catch (InterruptedException | BrokenBarrierException ex) {
                Logger.getLogger(TestFor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    };

    t1.start();
    t2.start();

我能够启动2个线程。现在我需要2个以上的线程,比方说50个。循环中唯一变化的参数是System.out.println("F2:" + i);作为FX,其中X是线程的编号。

有没有办法让这50个线程进入for循环?

3 个答案:

答案 0 :(得分:1)

您可以使用类似

的内容
List<Thread> tList = new ArrayList<Thread>();

for(int i = 0; i < 50; i++) {

    final int id = i;

    tList.add(new Thread() { 
             public void run() {
                 try {
                     gate.await();
                     for (int k = 0; k < 1000; k++) {
                         System.out.println("F" + id + ":" + k);
                     }
                 }
                 catch (InterruptedException | BrokenBarrierException ex) {
                     Logger.getLogger(TestFor.class.getName()).log(Level.SEVERE, null, ex);
                 }
              }
    });
}

要启动所有这些,您只需

for(Thread t : tList)
     t.start();

如果它真的是关于时间的,也许你的单个线程的代码增加,这将首先初始化所有这些并直接在彼此之后启动它们,所以你不需要考虑你实际需要的时间初始化它们。

答案 1 :(得分:0)

你的意思是,与此相似?

for (int j = 0; j < 50; ++j) {
    new Thread() {
        public void run() {
            try {
                gate.await();
                for (int i = 0; i < 1000; i++) {
                    System.out.println("F" + j + ":" + i);
                }
            } catch (InterruptedException | BrokenBarrierException ex) {
                Logger.getLogger(TestFor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }.start();
}

答案 2 :(得分:0)

如果您需要同时启动n个主题,则可以使用RunnableCallable转换为Executors.callable(),然后使用invokeAll() ExecutorService上的方法。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#invokeAll(java.util.Collection)

ExecutorService.invokeAll does NOT support collection of runnable task

提供了一个示例