我正在运行简单的程序,这里是日志
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()
?
答案 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));
}
}
}
}