public class ThreadPoolTaskF { public static void main(String[] args) throws InterruptedException {
System.out.println(QQUtil.getT(false) + " Start..................."); ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 2, 1,
TimeUnit.HOURS, new ArrayBlockingQueue<Runnable>(1),
new ThreadPoolExecutor.CallerRunsPolicy());
while (true) {
for (int i = 0; i < 3; i++) {
threadPool.execute(new ThreadPoolTask("#一、Thread:"
+ Thread.currentThread().getName() + " i=" + i + "#"));
for (int j = 0; j < 5; j++) {
getV("#二、Thread:" + Thread.currentThread().getName()
+ " i=" + i + " j=" + j + "#");
System.out.println(QQUtil.getT(false) + " 三、Thread:"
+ Thread.currentThread().getName() + " i=" + i
+ " j=" + j + Config.rn);
}
System.out.println(QQUtil.getT(false) + " 四、Thread:"
+ Thread.currentThread().getName() + " i=" + i
+ Config.rn);
}
System.out.println(QQUtil.getT(false) + " End...................");
}
} public static void getV(String str) throws InterruptedException { System.out.println(QQUtil.getT(false) + " 五、Thread:" + str
+ Thread.currentThread().getName() + Config.rn);
Thread.sleep(1000 * 60);// 60秒
System.out.println(QQUtil.getT(false) + " 六、Thread:" + str
+ Thread.currentThread().getName() + Config.rn);
} public static class ThreadPoolTask implements Runnable, Serializable {
private static final long serialVersionUID = 0; private Object threadPoolTaskData1; ThreadPoolTask(Object tasks1) {
this.threadPoolTaskData1 = tasks1;
} public void run() {
try {
getV(threadPoolTaskData1.toString());
} catch (Exception e) {
e.printStackTrace();
}
} }
}
1、我的本意是,想在内层的j循环里,加入线程池的概念,把5个任务(循环5次调用getV)分为2个线程来做,我本来以为,执行起来后,主线程运行到21行的时候,会分出两个线程,然后三个线程【主线程+线程池初始化2个线程】并发调用getV方法,然后程序就会挂起,挂起的时候j=2『(主线程+2个线程池线程)使j=2,因为只有3个线程工作,所以分到3个任务后,没有线程可以工作了系统就挂起了』,然后等待有线程调用getV方法结束了,又会增加变量j,继续调用getV方法,直到有线程使j<=5。然后主线程跳到外层循环【跳到外层循环前,我认为应该关闭线程池。但我不知道怎么关闭。】,这时i=1,然后线程池的线程又开始新一轮的调用getV操作,操作同上。但是从输出我觉得我理解的有问题,但我又不知道到底是怎么样的,看了很多网上的文档还是很混乱乱,不知道是否有人可以点拨一下呢,或者写下step大家一起探讨一下啊注:21行如下:threadPool.execute(new ThreadPoolTask("#一、Thread:"
+ Thread.currentThread().getName() + " i=" + i + "#"));2、在那里.shutdown()合适啊?我的想法是所有的工作都做完了在.shutdown(),但是我不知道在哪里写.shutdown()3、我初始化明明建立了2个线程,但是没什么输出的时候只有一个呢?
输出如下:2011-02-03 18:17---> Start...................
2011-02-03 18:17---> 五、Thread:#二、Thread:main i=0 j=0#main2011-02-03 18:17---> 五、Thread:#一、Thread:main i=0#pool-1-thread-12011-02-03 18:18---> 六、Thread:#二、Thread:main i=0 j=0#main2011-02-03 18:18---> 三、Thread:main i=0 j=02011-02-03 18:18---> 六、Thread:#一、Thread:main i=0#pool-1-thread-12011-02-03 18:18---> 五、Thread:#二、Thread:main i=0 j=1#main2011-02-03 18:19---> 六、Thread:#二、Thread:main i=0 j=1#main2011-02-03 18:19---> 三、Thread:main i=0 j=12011-02-03 18:19---> 五、Thread:#二、Thread:main i=0 j=2#main2011-02-03 18:20---> 六、Thread:#二、Thread:main i=0 j=2#main2011-02-03 18:20---> 三、Thread:main i=0 j=22011-02-03 18:20---> 五、Thread:#二、Thread:main i=0 j=3#main2011-02-03 18:21---> 六、Thread:#二、Thread:main i=0 j=3#main2011-02-03 18:21---> 三、Thread:main i=0 j=32011-02-03 18:21---> 五、Thread:#二、Thread:main i=0 j=4#main2011-02-03 18:22---> 六、Thread:#二、Thread:main i=0 j=4#main2011-02-03 18:22---> 三、Thread:main i=0 j=42011-02-03 18:22---> 四、Thread:main i=02011-02-03 18:22---> 五、Thread:#二、Thread:main i=1 j=0#main2011-02-03 18:22---> 五、Thread:#一、Thread:main i=1#pool-1-thread-22011-02-03 18:23---> 六、Thread:#二、Thread:main i=1 j=0#main2011-02-03 18:23---> 六、Thread:#一、Thread:main i=1#pool-1-thread-22011-02-03 18:23---> 三、Thread:main i=1 j=02011-02-03 18:23---> 五、Thread:#二、Thread:main i=1 j=1#main2011-02-03 18:24---> 六、Thread:#二、Thread:main i=1 j=1#main2011-02-03 18:24---> 三、Thread:main i=1 j=12011-02-03 18:24---> 五、Thread:#二、Thread:main i=1 j=2#main2011-02-03 18:25---> 六、Thread:#二、Thread:main i=1 j=2#main2011-02-03 18:25---> 三、Thread:main i=1 j=22011-02-03 18:25---> 五、Thread:#二、Thread:main i=1 j=3#main2011-02-03 18:26---> 六、Thread:#二、Thread:main i=1 j=3#main2011-02-03 18:26---> 三、Thread:main i=1 j=32011-02-03 18:26---> 五、Thread:#二、Thread:main i=1 j=4#main2011-02-03 18:27---> 六、Thread:#二、Thread:main i=1 j=4#main2011-02-03 18:27---> 三、Thread:main i=1 j=42011-02-03 18:27---> 四、Thread:main i=12011-02-03 18:27---> 五、Thread:#一、Thread:main i=2#pool-1-thread-12011-02-03 18:27---> 五、Thread:#二、Thread:main i=2 j=0#main2011-02-03 18:28---> 六、Thread:#二、Thread:main i=2 j=0#main2011-02-03 18:28---> 三、Thread:main i=2 j=02011-02-03 18:28---> 五、Thread:#二、Thread:main i=2 j=1#main2011-02-03 18:28---> 六、Thread:#一、Thread:main i=2#pool-1-thread-12011-02-03 18:29---> 六、Thread:#二、Thread:main i=2 j=1#main2011-02-03 18:29---> 三、Thread:main i=2 j=12011-02-03 18:29---> 五、Thread:#二、Thread:main i=2 j=2#main2011-02-03 18:30---> 六、Thread:#二、Thread:main i=2 j=2#main2011-02-03 18:30---> 三、Thread:main i=2 j=22011-02-03 18:30---> 五、Thread:#二、Thread:main i=2 j=3#main2011-02-03 18:31---> 六、Thread:#二、Thread:main i=2 j=3#main2011-02-03 18:31---> 三、Thread:main i=2 j=32011-02-03 18:31---> 五、Thread:#二、Thread:main i=2 j=4#main2011-02-03 18:32---> 六、Thread:#二、Thread:main i=2 j=4#main2011-02-03 18:32---> 三、Thread:main i=2 j=42011-02-03 18:32---> 四、Thread:main i=22011-02-03 18:32---> End...................
2011-02-03 18:32---> 五、Thread:#一、Thread:main i=0#pool-1-thread-22011-02-03 18:32---> 五、Thread:#二、Thread:main i=0 j=0#main2011-02-03 18:33---> 六、Thread:#一、Thread:main i=0#pool-1-thread-22011-02-03 18:33---> 六、Thread:#二、Thread:main i=0 j=0#main2011-02-03 18:33---> 三、Thread:main i=0 j=02011-02-03 18:33---> 五、Thread:#二、Thread:main i=0 j=1#main2011-02-03 18:34---> 六、Thread:#二、Thread:main i=0 j=1#main2011-02-03 18:34---> 三、Thread:main i=0 j=12011-02-03 18:34---> 五、Thread:#二、Thread:main i=0 j=2#main2011-02-03 18:35---> 六、Thread:#二、Thread:main i=0 j=2#main2011-02-03 18:35---> 三、Thread:main i=0 j=22011-02-03 18:35---> 五、Thread:#二、Thread:main i=0 j=3#main2011-02-03 18:36---> 六、Thread:#二、Thread:main i=0 j=3#main2011-02-03 18:36---> 三、Thread:main i=0 j=32011-02-03 18:36---> 五、Thread:#二、Thread:main i=0 j=4#main2011-02-03 18:37---> 六、Thread:#二、Thread:main i=0 j=4#main2011-02-03 18:37---> 三、Thread:main i=0 j=42011-02-03 18:37---> 四、Thread:main i=02011-02-03 18:37---> 五、Thread:#二、Thread:main i=1 j=0#main2011-02-03 18:37---> 五、Thread:#一、Thread:main i=1#pool-1-thread-12011-02-03 18:38---> 六、Thread:#二、Thread:main i=1 j=0#main2011-02-03 18:38---> 三、Thread:main i=1 j=02011-02-03 18:38---> 五、Thread:#二、Thread:main i=1 j=1#main2011-02-03 18:38---> 六、Thread:#一、Thread:main i=1#pool-1-thread-12011-02-03 18:39---> 六、Thread:#二、Thread:main i=1 j=1#main2011-02-03 18:39---> 三、Thread:main i=1 j=12011-02-03 18:39---> 五、Thread:#二、Thread:main i=1 j=2#main2011-02-03 18:40---> 六、Thread:#二、Thread:main i=1 j=2#main2011-02-03 18:40---> 三、Thread:main i=1 j=22011-02-03 18:40---> 五、Thread:#二、Thread:main i=1 j=3#main2011-02-03 18:41---> 六、Thread:#二、Thread:main i=1 j=3#main2011-02-03 18:41---> 三、Thread:main i=1 j=32011-02-03 18:41---> 五、Thread:#二、Thread:main i=1 j=4#main2011-02-03 18:42---> 六、Thread:#二、Thread:main i=1 j=4#main2011-02-03 18:42---> 三、Thread:main i=1 j=42011-02-03 18:42---> 四、Thread:main i=12011-02-03 18:42---> 五、Thread:#二、Thread:main i=2 j=0#main2011-02-03 18:42---> 五、Thread:#一、Thread:main i=2#pool-1-thread-22011-02-03 18:43---> 六、Thread:#二、Thread:main i=2 j=0#main2011-02-03 18:43---> 三、Thread:main i=2 j=02011-02-03 18:43---> 五、Thread:#二、Thread:main i=2 j=1#main2011-02-03 18:43---> 六、Thread:#一、Thread:main i=2#pool-1-thread-22011-02-03 18:44---> 六、Thread:#二、Thread:main i=2 j=1#main2011-02-03 18:44---> 三、Thread:main i=2 j=12011-02-03 18:44---> 五、Thread:#二、Thread:main i=2 j=2#main2011-02-03 18:45---> 六、Thread:#二、Thread:main i=2 j=2#main2011-02-03 18:45---> 三、Thread:main i=2 j=22011-02-03 18:45---> 五、Thread:#二、Thread:main i=2 j=3#main2011-02-03 18:46---> 六、Thread:#二、Thread:main i=2 j=3#main2011-02-03 18:46---> 三、Thread:main i=2 j=32011-02-03 18:46---> 五、Thread:#二、Thread:main i=2 j=4#main2011-02-03 18:47---> 六、Thread:#二、Thread:main i=2 j=4#main2011-02-03 18:47---> 三、Thread:main i=2 j=42011-02-03 18:47---> 四、Thread:main i=22011-02-03 18:47---> End...................
2011-02-03 18:47---> 五、Thread:#二、Thread:main i=0 j=0#main2011-02-03 18:47---> 五、Thread:#一、Thread:main i=0#pool-1-thread-12011-02-03 18:48---> 六、Thread:#二、Thread:main i=0 j=0#main2011-02-03 18:48---> 六、Thread:#一、Thread:main i=0#pool-1-thread-12011-02-03 18:48---> 三、Thread:main i=0 j=02011-02-03 18:48---> 五、Thread:#二、Thread:main i=0 j=1#main2011-02-03 18:49---> 六、Thread:#二、Thread:main i=0 j=1#main2011-02-03 18:49---> 三、Thread:main i=0 j=12011-02-03 18:49---> 五、Thread:#二、Thread:main i=0 j=2#main2011-02-03 18:50---> 六、Thread:#二、Thread:main i=0 j=2#main2011-02-03 18:50---> 三、Thread:main i=0 j=22011-02-03 18:50---> 五、Thread:#二、Thread:main i=0 j=3#main

解决方案 »

  1.   

    看到这一大堆我就看不下去了!代码的 for 循环中看上去就是一团
    文字说明也是堆在一起了
    示例输出则更吓人
      

  2.   

    不知道LZ的本意是什么?就拿你的代码来做个大概分析吧
    首先外层的for,当i=0时,执行threadPool.execute会往线程池追加一个执行任务(该任务由系统来调度,不一定马上就执行),
    然后主线程继续进入第二个for,此时主线程会5次调用getV方法,因为getV会发生sleep,所以线程池的任务可能和主线程的执行交替进行,但是线程池只有一个任务,当线程池的getV结束,就只剩下主线程继续在第二层循环中继续执行getV
    当主线程5次执行getV,即第二个for循环结束后,i=1继续下一个外层for循环,执行结果同上
    同样的,i=2时也是同上一样的执行结果,此时i循环结束,继续while循环,执行结果还是同上用结果来说明
    2011-02-03 18:17---> Start................... 主线程首先打印的,然后进入while,进入第一个for循环i=0,往线程池追加一个任务,线程池由系统调度,所以不一定马上执行
    2011-02-03 18:17---> 五、Thread:#二、Thread:main i=0 j=0#main 主线程继续,进入第二个for循环j=0,执行getV,然后sleep2011-02-03 18:17---> 五、Thread:#一、Thread:main i=0#pool-1-thread-1 线程池执行getV,然后sleep2011-02-03 18:18---> 六、Thread:#二、Thread:main i=0 j=0#main 主线程继续执行getV的sleep后面的代码,getV调用结束2011-02-03 18:18---> 三、Thread:main i=0 j=0 主线程继续执行getV调用结束后的代码2011-02-03 18:18---> 六、Thread:#一、Thread:main i=0#pool-1-thread-1 系统调度,线程池sleep过后继续执行getV后面的代码,getV执行结束,线程池任务结束,之后就剩下主线程了2011-02-03 18:18---> 五、Thread:#二、Thread:main i=0 j=1#main 主线程继续第二层for循环j=1,执行getV,然后sleep2011-02-03 18:19---> 六、Thread:#二、Thread:main i=0 j=1#main 主线程继续执行getV的sleep后面的代码,getV结束2011-02-03 18:19---> 三、Thread:main i=0 j=1 主线程继续执行getV后面的代码2011-02-03 18:19---> 五、Thread:#二、Thread:main i=0 j=2#main 主线程继续第二层循环j=2,调用getV,后面同上,一直到j=4,第二层for循环结束2011-02-03 18:22---> 四、Thread:main i=0 然后主线程继续执行第二层for后面的代码2011-02-03 18:22---> 五、Thread:#二、Thread:main i=1 j=0#main 然后主线程继续第一层for循环i=1,往线程池追加一个任务(线程池任务不一定马上执行),然后进入第二层for循环,执行getV,然后sleep2011-02-03 18:22---> 五、Thread:#一、Thread:main i=1#pool-1-thread-2 系统调度,线程池执行任务,之后的执行结果同上,直到外层for循环结束2011-02-03 18:47---> End................... 然后主线程继续执行外层for后面的代码
    2011-02-03 18:47---> 五、Thread:#二、Thread:main i=0 j=0#main 然后主线程重新while循环,结果同上2011-02-03 18:47---> 五、Thread:#一、Thread:main i=0#pool-1-thread-1
      

  3.   

    答LZ所问
    1 你的代码不是你想要的结果,如果想第二层循环3个线程同时控制j,应该把j的做成成员,在getV控制j的累加和判断j<=52 你的工作完成是指什么,如果是指for执行结束,那么不用while就可以了,在两个for结束后,shutdown就可以3 外层循环一次,才会往线程池追加一个任务,而且该任务结束后,线程池就没任务,挂起了,所以内层循环是不会有两个线程池任务执行的,除非一上来在外层循环中就追加2个任务
      

  4.   


    非常感谢你啊,大概明白一点了啊。2 你的工作完成是指什么,如果是指for执行结束,那么不用while就可以了,在两个for结束后,shutdown就可以我的意思是,我不知道线程池的那个线程什么时候工作完了,如果我在两个for后面关闭线程池。那线程池里的线程如果还在工作那不是就关闭错了吗?
      

  5.   

    可以直接运行啊
    public class ThreadPoolTaskF {
    public static void main(String[] args) throws InterruptedException {
    System.out.println(QQUtil.getT(false) + " Start..................."); ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 1,
    TimeUnit.HOURS, new ArrayBlockingQueue<Runnable>(1),
    new ThreadPoolExecutor.CallerRunsPolicy());
    for (int i = 0; i < 2; i++) { System.out.println("Main:i=" + i + " Thread:"
    + Thread.currentThread().getName());
    for (int j = 0; j < 5; j++) {
    threadPool.execute(new ThreadPoolTask(" [Thread:"
    + Thread.currentThread().getName() + " i=" + i + " j="
    + j + " " + "] ")); }
    } System.out.println(QQUtil.getT(false) + " End...................");
    } public static void getV(String str) throws InterruptedException { Thread.sleep(1000 * 20);// 10秒
    System.out.println("getV:" + Thread.currentThread().getName() + str); } public static class ThreadPoolTask implements Runnable, Serializable {
    private static final long serialVersionUID = 0; private Object threadPoolTaskData1; ThreadPoolTask(Object tasks1) {
    this.threadPoolTaskData1 = tasks1;
    } public void run() {
    try {
    getV(threadPoolTaskData1.toString());
    } catch (Exception e) {
    e.printStackTrace();
    }
    } }
    }有下面三个问题啊~希望能帮忙回答下啊!谢谢了同时祝新年快乐啊。
      

  6.   

    1、为什么 “pool-1-thread-1” 线程里面输出的Thread是Main而不是Thread-1的名字呢?
    如输出“getV:pool-1-thread-1 [Thread:main i=0 j=0 ]”2、如果主线程,再次运行到外层循环【i=1的时候】,但内层循环里线程池里的线程,还没有完成工作。主线程进入内存循环后又执行了
    threadPool.execute(new ThreadPoolTask(" [Thread:" +Thread.currentThread().getName() + " i=" + i + " j=" + j + " " + "] "));
     这句,那会出现什么情况呢?是线程池由于满了不再接受任务了,由主线程自己执行,等到线程池的线程执行完任务,才会再次工作,如果一直执行不完,主程序就会一直在那里循环吗?



    3、我想等内层j循环,所有的任务都做完了以后,在去外层循环,这个一般都怎么实现啊?
      

  7.   

    1 你的线程池是这样传的参数
    threadPool.execute(new ThreadPoolTask("#一、Thread:"
                            + Thread.currentThread().getName() + " i=" + i + "#"));
    这句话是主线程调用的,所以此时的Thread.currentThread().getName() 是main
    而线程的run是
    getV(threadPoolTaskData1.toString());这样调用getV的
    所以getV时
    System.out.println(QQUtil.getT(false) + " 五、Thread:" + str
                    + Thread.currentThread().getName() + Config.rn); //str字符串就是main,然后Thread.currentThread().getName() 这个才是线程的名字pool-1-thread-12 线程池不会不接受任务,只是把任务放在内部的队列里,等待有空闲的线程时再执行任务,主线程是不会自己执行线程池的任务的,也不会等待线程池的任务,因为你没有用同步,所以不会一直停留在循环里,循环会继续执行,也就是说,在你的这段代码里主线程和线程池互不影响。3 如果这样,就要用同步方法,让线程排他等待,同时j的累加要放到同步方法里,内存循环不用for,而是用while,当j<5时继续内层循环,否则退出内循环