我有一个基于 Java 的游戏服务器。1个用户需要使用2个线程来发送和接收数据。但是每当线程达到200-300个线程时,执行数据的功能就不再起作用了。服务器的CPU、RAM还没有满,大约只有15-20%。我尝试在用户断开连接时使用“垃圾收集器”,但这种情况仍然发生。谢谢你的帮助。抱歉我的英语不好。
代码 :
public class Test
{
public static void Main()
{
int threadCount = ThreadPool.ThreadCount;
Console.WriteLine($"thread count : {threadCount}");
ThreadPool.SetMinThreads(1, 2);
Console.WriteLine(ThreadPool.SetMaxThreads(1, 2));
List<Task> tlist = new();
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"repeat {i}");
tlist.Add(Task.Run(() =>
{
threadCount = ThreadPool.ThreadCount;
Console.WriteLine($"thread count : {threadCount}");
return FuncAsync();
}));
Console.WriteLine($"repeat end {i}");
}
Task.WaitAll(tlist.ToArray());
}
public static async Task FuncAsync()
{
Console.WriteLine("FuncAsync");
}
}
Run Code Online (Sandbox Code Playgroud)
此代码仅在使用“发布”构建“运行”时才起作用。
| 调试 | 跑步 | |
|---|---|---|
| 调试构建 | 工作 | 不工作 |
| 发布版本 | 工作 | 工作 |

首先,对不起我的英语能力......
我想知道当线程池的最大容量为 1 时异步方法如何工作。但是我遇到了一些意外的错误。 …
在我将它放入我的应用程序之前,我正在测试一个简单的线程池解决方案,但我看到的结果对我来说没有意义.我有一个简单的表单,上面有一个按钮.此按钮启动以下循环:
private void button1_Click(object sender, EventArgs e)
{
MyTestThread oTask = new MyTestThread ();
MyThreadInfo oTaskParameters = new MyThreadInfo();
for (int i = 1; i <= 5; i++)
{
objTaskParameters.MyGuid = Guid.NewGuid();
objTaskParameters.MyNumber = i;
ThreadPool.QueueUserWorkItem(new WaitCallback(objTask.ProcessDataForNTime), objTaskParameters);
}
Console.WriteLine("All threads have been queued for processing...");
}
Run Code Online (Sandbox Code Playgroud)
它正在调用的类看起来像这样.它有一个参数MyThreadInfo类,然后MyTestThread类在完成之前循环10秒.
public class MyThreadInfo
{
public int MyNumber;
}
public class MyTestThread
{
public void ProcessDataForNTime(Object oParameters)
{
//We pass parameters
MyThreadInfo oThread = (MyThreadInfo)oParameters;
int threadNo = oThread.MyNumber;
Console.WriteLine("thread {0} started...", threadNo); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用boost线程池库创建一个线程池,但在定义它时,我不断收到很多关于模板参数错误的错误.
我可能做了一些根本错误的事情,但我没有看到它?
//Threadpool
typedef boost::threadpool::thread_pool<
boost::threadpool::task_func,
boost::threadpool::fifo_scheduler<tsk>,
boost::threadpool::static_size<boost::threadpool::fifo_pool>,
boost::threadpool::resize_controller<boost::threadpool::fifo_pool>,
boost::threadpool::wait_for_active_tasks<boost::threadpool::fifo_pool>
> pool;
Run Code Online (Sandbox Code Playgroud)
错误:
------ Build started: Project: Trial, Configuration: Debug Win32 ------
Compiling...
Trial.cpp
error C2923: 'boost::threadpool::fifo_scheduler' : 'tsk' is invalid as template argument '#1', type expected
see declaration of 'tsk'
error C3200: 'boost::threadpool::fifo_pool' : invalid template argument for template parameter 'SizePolicy', expected a class template
error C3200: 'boost::threadpool::resize_controller<Pool>' : invalid template argument for template parameter 'SizePolicyController', expected a class template
with
[
Pool=boost::threadpool::fifo_pool
]
error C3200: 'boost::threadpool::wait_for_active_tasks<Pool>' : invalid …Run Code Online (Sandbox Code Playgroud) 我有一个Java应用程序,重点关注并发性和可突发容量.这意味着它使用线程池来排队和执行事件.
所有这些线程池都是固定大小的,但是当应用程序部署在Linux(CentOS 5.5)服务器上时,我经常发现自己遇到了打开文件描述符限制.
据我所知,应用程序在加载时,任何时候都不应该创建超过20个线程,但我的命中ulimit率为1024.
有没有什么办法可以跟踪这些线程回到创建它们的代码/池?
好吧,标题的措辞有点奇怪,但我真的不知道如何表达它.基本上,从我对Java和线程的理解是你创建一个线程,它运行,它死了.但是,线程OBJECT仍然存在.如果这样的事情有效,我想知道什么
int numWorkers = Integer.parseInt(args[0]);
int threadPoolSize = Integer.parseInt(args[1]);
ExecutorService tpes = Executors.newFixedThreadPool(threadPoolSize);
WorkerThread[] workers = new WorkerThread[numWorkers];
while(some condition)
for (int i = 0; i < numWorkers; i++) {
workers[i] = new WorkerThread(i, *some changing parameters*);
tpes.execute(workers[i]);
}
Run Code Online (Sandbox Code Playgroud)
基本上这种情况是我们有一些条件,我们不知道何时会满足.假设我使用8个线程.我创建所有8个线程,他们做他们的事情并返回.我把他们的结果放在一起,意识到我还没有完成.但是,例如,worker [0]已经存在.我用一个新的WorkerThread()调用创建了它.但它现在已经死了,因为它已经完成了.如果我打电话,AGAIN,工人[0] =新的WorkerThread(0,新参数)......是允许的吗?我需要更多线程,我已经有一个已经(现在)死线程的数组......我可以将它们指向其他东西吗?GC是否正确收集旧线程?
我有一个ThreadPoolExecutor我用自定义创建的ThreadFactory.当我调用execute()传递my 的方法时Runnable,Thread使用我的自定义创建一个new ThreadFactory.问题是我无法找到一种方法来访问里面的信息Runnable.
例如,我有一个Job实现的类Runnable.在里面Job,我有一个属性A,我想在newThread()我的自定义方法中访问ThreadFactory.问题是我不能将Runnable传递的as参数转换为,Job因为它不是一个Job实例,它是ThreadPoolExecutor.Worker类的一个实例,而这个类是private.
任何人都可以给我一个简单的例子,我们已经创建了自己的threadpool类来更好地感受线程.我不想使用java中提供的Executor Service.我的意思是线程池的任何内置类.
谢谢
假设我在java中有一个线程A. 这个线程继续执行一些任务A.我有另一个线程B,只有在任务A完成后才能执行任务B. 我如何在Java中实现它?
我希望利用在我的网站上运行多个线程.
在这种情况下,我有一个任务,我需要向多个用户发送电子邮件.我必须考虑一次可能发送100封电子邮件的事实.
我不想要的是,最终用户要等待发送这些电子邮件,这需要太长时间.我想要做的是在单独的线程上发送这些电子邮件,以便我当前的页面可以继续处理页面.
这个想法是用户不需要等待这些电子邮件被解雇和完成,没有消息告知用户电子邮件已经成功发送,这只是在后台完成的事情.
用户只需要能够在系统使用时进行遗忘.
我的问题是,处理这个问题的最佳方法是什么.
我应该考虑使用线程池,还是使用异步方法更好?
任何意见,将不胜感激.