Java 当变量达到一定值时,如何关闭线程池?

NBA_2011 2011-12-13 05:03:20

背景:获取一定数量的数据,但这个数量比较大(10W)。为了达到这个数据量,我用了一个变量进行控制(名为:Count)。如果采用一个线程,速度会很慢,所以想到用多线程。


问题:由于线程的执行顺序不一样,而且一个线程在执行的时候,另一个线程也可能在执行。这样就不好控制它们的共同变量——Count
一开始,本人采用线程池ThreadPoolExecutor去解决这一问题。但是没有成功,问题是当我调用shutdown()方法时,线程池并不真正关闭。


不理想的解决的方法:后来采用了线程的Join方法,但这样,就跟一个线程处理没什么两样了。


那位高手有更好的方法?谢谢。。

----------------------------------------------------------
下面的 源码只是为了测试用。
源码如下:
1. TestUtil.java
public final class TestUtil {

public static volatile int TEST_COUNT = 1;
public static boolean shutdown = false;
}

2.RunnableForTest

public class RunnableForTest implements Runnable {

int num;

public RunnableForTest(int num) {
this.num = num;
}

@Override
public void run() {
System.out.println("TestUtil.TEST_COUNT :" + TestUtil.TEST_COUNT++);
}

}

3. TestWebSpiderExecutor.java (含main方法的函数)
public class TestWebSpiderExecutor {

public static void main(String[] args) {
TestWebSpiderExecutor twse = new TestWebSpiderExecutor();
twse.testCleanWithThread();
}

//这个方法不成功,
public void testCleanWithExecutor() {
BlockingQueue<Runnable> qu = new ArrayBlockingQueue<Runnable>(5);
WebSpiderExecutor wse = new WebSpiderExecutor(2, 30, 1,
TimeUnit.MILLISECONDS, qu,
new ThreadPoolExecutor.DiscardPolicy());

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

if(TestUtil.TEST_COUNT > 25){
wse.clean();
break;
}
}

}

//这个方法可以用,但不理想
public void testCleanWithThread() {
for (int i = 0; i < 50; i++) {
RunnableForTest rft = new RunnableForTest(i);
Thread t = new Thread(rft,""+i);

if(TestUtil.TEST_COUNT >= 25){
break;
}
// System.out.print("i="+i);
t.start();
System.out.println(t.getName());
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}
...全文
254 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧