我的java程序中运行了多少个线程?

时间:2015-05-13 14:22:12

标签: java multithreading

我正在运行简单的程序,这里是日志

Total Thread : 6  // using Thread.activeCount()
pool-1-thread-143

这是课程

public class Test implements Runnable{

    String              ul;
    ExecutorService     threadPool;
    public Test(String s, ExecutorService executor)
    {
        this.ul = s;
        threadPool  =   executor;
    }

    public void run() {
        try {
            Fun(ul);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void Fun(String ss) throws IOException
    {

    // .... 
        System.out.println("Total Thread : "+Thread.activeCount());
       Iterator iterator = links.iterator();
       while(iterator.hasNext())
       {
          Element ele = iterator.next();
          String s = ele.getprop("....");
          if(!Model.condition(s))
          {
              System.out.println(Thread.currentThread().getName());
              threadPool.execute(new Test(s, threadPool));
          }
       }        
    }
}

这是Main.java

   ExecutorService executor = Executors.newFixedThreadPool(5);        
    executor.execute(new Test("this is something", executor));          
    while (!executor.isTerminated()) {   }         

那么我的程序运行了多少实际线程? 我是否已在此计划中正确实施executor.execute()

3 个答案:

答案 0 :(得分:1)

主程序的一个线程和池中的五个线程,如您所见,总共6个。这是Threadpool的完美使用,虽然Test执行新的Test似乎有点费解?!

干杯,

答案 1 :(得分:1)

Executors调用创建一个固定大小的线程池为5.应用程序在main线程上启动...因此5 + 1 = 6

答案 2 :(得分:0)

代码的实现有点笨拙。 这个部分看起来有点丑陋threadPool.execute(new Test(s, threadPool));,因为你传递变量的引用作为参数,它本身正在调用方法。

我宁愿将线程池执行器保留在Test类之外,并将多个测试类实例传递给它。

上面的答案中解释的计数是5 + 1主线程。

这就是我将如何做到的。通过添加更多的模块化可以进一步改进主要方法,但目标是ThreadPool应该存在于Runnable实现之外。

public class Test implements Runnable{

    String              ul;    
    public Test(String s)
    {
        this.ul = s;        
    }

    public void run() {
        try {
            Fun(ul);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void Fun(String ss) throws IOException
    {

    // .... 
        System.out.println("Total Thread : "+Thread.activeCount());

        System.out.println(Thread.currentThread().getName());

       }        
    }
}

public class MyRunnerClass {

   public static void main(String args[]){
     ExecutorService executor = Executors.newFixedThreadPool(5);
     String s = "this is something";

      Iterator iterator = links.iterator();
      while(iterator.hasNext())
       {
          Element ele = iterator.next();
          String s = ele.getprop("....");
          if(!Model.condition(s))
          {              
              executor.execute(new Test(s, threadPool));
          }
       } 

   }
}