如何使线程限制在java?



我有一个节点程序,每次从负载均衡器发送一个作业包给它时,它都会启动一个线程,并在几秒钟内完成。一旦线程完成,线程将数据包发送回负载均衡器(它根据数据包中给出的秒数等待发送)。节点有一个最大容量,它可以同时处理作业。目前它没有限制地完成任务,我需要根据节点的容量限制可以同时工作的线程数量

public void run() {
try {
//Puts thread to sleep based from jobTime
TimeUnit.SECONDS.sleep(jobTime);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("job " + jobID + " completed and sent to loadbalancer! " + this);
Node.getMessageSender().getJobList().remove(this);
//String created to send finished job packet
String finData = "FINISH," + jobID + "," + Node.getMessageSender().getPort();
DatagramPacket finPacket = new DatagramPacket(finData.getBytes(), finData.length(),
Node.getMessageSender().getAddress(), Node.getMessageSender().getPort());
try {
//Sends message to loadbalancer
Node.getMessageSender().getSocket().send(finPacket);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

编辑:节点必须接受所有其他传入的作业数据包,并将它们排队,直到节点不再处于最大容量

您将不得不考虑如果在节点达到最大上限时将作业交给您的节点意味着什么。它应该被拒绝吗?它应该被接受并排队吗?无论如何,答案很可能在java.util.concurrent包中,例如,ThreadPoolExecutor

如果你必须自己滚动(不知道为什么,但让我们说),你必须编程。Java库类是开源的;你可以看看ThreadPoolExecutor的impl来获得灵感。

通常一个中央线程作为分配和管理系统。有一个AtomicInteger或CountdownLatch,每个生成的线程递增,在try/finally块中,完成后递减。拒绝传入请求(或阻塞,如果您想这样做,锁存器在这里可能很有用)。相反,如果您想要将作业放入待完成的任务队列中,那么您真的应该使用TPE。

最新更新