ThreadPoolExecutor的使用问题

发布于 2021-11-11 06:18:06 字数 3041 浏览 667 评论 9

大家帮忙看一下这么写有没有问题?

测试中发现poo.getPoolSize()一直在增加,不理解。

package zzzzzz;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TT implements Runnable {
	
	private static boolean next = true;
	private static ThreadPoolExecutor pool;
	public static List<String> list = new ArrayList<String>();
	
	private static List<String> ns = new ArrayList<String>();
	
	static {
		//初始化线程池
		pool = new ThreadPoolExecutor(25, 50, 35,
			TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(35),
			new ThreadPoolExecutor.DiscardOldestPolicy());
		
		ns.add("w1");
		ns.add("w2");
		ns.add("w3");
		ns.add("w4");
		ns.add("w5");
	}
	
	public void setNext(boolean next) {
		this.next = next;
	}
	
	public static void stop() {
		
		System.err.println("[TEST][TT] Service is stopping ......");
		
		next = false;
		if(pool != null) pool.shutdown();
	}
	
	public void run() {
		
		System.err.println("[TEST][TT] Service is start ......");
		// TODO Auto-generated method stub
		Writer w = null;
		
		while(next){
			
			for(String s : ns) {
				if(list.contains(s)){
					System.err.println("[TEST][TT] thread "+s+" is running ,Leaving for now.");
				} else {
					w = new Writer(s);
					pool.execute(w);
					list.add(s);
				}
			}
			
			try {	Thread.sleep(5000);
			} catch (InterruptedException e) { e.printStackTrace(); }
		}
	}
	
	public static void listPool() {
		
		System.err.println("pool.getActiveCount() = " + pool.getActiveCount());
		System.err.println("pool.getPoolSize() = " + pool.getPoolSize());
		System.err.println("pool.getTaskCount() = "+pool.getTaskCount());
		System.err.println("pool.getCompletedTaskCount() = "+pool.getCompletedTaskCount());
		System.err.println("pool.getMaximumPoolSize() = "+pool.getMaximumPoolSize());
		System.err.println("pool.getLargestPoolSize() = "+pool.getLargestPoolSize());
		System.err.println("pool.getCorePoolSize() = "+pool.getCorePoolSize());
		
		ArrayBlockingQueue<Runnable> queue = (ArrayBlockingQueue<Runnable>)pool.getQueue();
		System.out.println("queue.size() = " + queue.size());
		
	}
	
	public static void list() {
		for(String s : list) {
			System.out.println("[TT][list]------------->"+s);
		}
	}
}

class Writer implements Runnable{
	
	private String name;
	//private ThreadPoolExecutor pool;
	
	public Writer(String name){
		this.name = name;
		//this.pool = pool;
	}
	
	public void run() {
		
		// TODO Auto-generated method stub
		
		//try {
			//Thread.sleep(5000);
		//} catch (InterruptedException e) { e.printStackTrace(); }
		
		System.err.println("[TEST][Writer]" + name + " is run end !");
		
		if(TT.list.contains(name))	TT.list.remove(name);
		//pool.remove(this);
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

秋意浓 2021-11-14 22:15:09

引用来自#8楼“KINSEY”的帖子

引用来自#6楼“heguangdong”的帖子

25是核心线程,涨到最大线程数50应该都是正常的,难道我的机器比你快,仅用25个就都能跑完?

明媚如初 2021-11-14 22:14:15

引用来自#7楼“KINSEY”的帖子

我的问题是线程都运行完了,pool.getPoolSize()的值还是25

有没有那个方法能得到这个线程池里面活跃的线程数?

兮颜 2021-11-14 22:13:04

引用来自#6楼“heguangdong”的帖子

25是核心线程,涨到最大线程数50应该都是正常的,难道我的机器比你快,仅用25个就都能跑完?

明月松间行 2021-11-14 22:12:03

我的问题是线程都运行完了,pool.getPoolSize()的值还是25

有没有那个方法能得到这个线程池里面活跃的线程数?

情绪失控 2021-11-14 22:04:14

25是核心线程,涨到最大线程数50应该都是正常的,难道我的机器比你快,仅用25个就都能跑完?

勿忘初心 2021-11-14 19:07:19

引用来自#4楼“heguangdong”的帖子

刚才跑了一下你的程序,一直维持在25个核心线程,没发现你说的结果?

甜柠檬 2021-11-14 18:28:44

刚才跑了一下你的程序,一直维持在25个核心线程,没发现你说的现象?

爱的故事 2021-11-14 13:30:31

引用来自#2楼“heguangdong”的帖子

构造方法第三个参数 keepAliveTime为0  

因为看清所以看轻 2021-11-12 22:47:53

构造方法第三个参数 keepAliveTime为0  

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文