简单的并发Java线程 - 捕获开始和结束

时间:2014-10-27 04:53:48

标签: java multithreading

我是否正确实现了这些Java线程?目标是有10个并发线程计算从1到(上限22 + i)的和。我试图识别名称并在运行线程时打印它,然后在线程退出时打印结果。目前,我将所有结果以随机顺序同时打印,我不确定在线程开始和结束时是否正确获取信息。

public class threads {
  public static void main(String[] args) {
    for(int i = 0; i < 10; i++) {
      final int iCopy = i;
      new Thread("" + i) {
        public void run() {
          int sum = 0;
          int upperBound = 22;
          int lowerBound = 1;
          long threadID = Thread.currentThread().getId();

          for (int number = lowerBound; number <= upperBound; number++){
            sum = sum + number + iCopy;

          }
          System.out.println(threadID + " thread is running now, I and will compute the sum from 1 to " + (upperBound + iCopy) + ". The i is : " + iCopy);
          System.out.println("Thread id #" + threadID + ", the "+ sum + " is done by the thread.");
        }

      }.start();
    }
  }
}

2 个答案:

答案 0 :(得分:2)

我执行了你的代码并观察到在这种情况下所有线程都正常运行10。因为线程是以随机顺序调用的,这就是为什么会出现这种行为的原因,但我确信所有线程都可以正常运行并执行您需要的功能。

输出中的任何一个我在for循环中看到的值应该从0到9开始,但这里甚至是随机的,可能是因为某些线程在执行时正在休眠并让位给其他线程。

希望这会有所帮助 感谢。

答案 1 :(得分:0)

线程运行的顺序将完全取决于所使用的JVM和底层资源。

如果您有多个核心(cpus)可用,则您的代码可能与单个核心完全不同。

基本上,您的主循环在单个线程中运行到最后,触发10个新线程,并将start方法放入进程队列中。其他处理器可能会开始运行这些线程每个额外的线程会导致不同的总负载,因此它们在每个处理器上的运行方式略有不同(性能方面),这意味着它们运行得更快/更慢,并在不同的时间结束。

您的代码非常好地展示了这一点。