标签: threadpool

ThreadPoolExecutor - 指定哪个线程处理给定的任务

是否有一种很好的方法来实现一个执行策略,该策略可以根据某种识别方案确定哪个线程将处理给定的任务?或者这甚至是一个好方法?

我需要处理 1-many 文件,我将在交错块中接收这些文件。当块到达时,我想完成处理该块的任务。问题是我没有让处理代码成为线程安全的奢侈,所以一旦池中的线程处理了文件中的一个块,我需要同一个线程来处理该文件的其余部分。我不在乎一个线程是否正在同时处理多个文件,但我不能同时处理同一个文件的池中的多个线程。

《Java 并发实践》一书指出,您可以使用执行策略来确定“任务将在哪个线程中执行?”,但我不明白如何执行。

谢谢

java parallel-processing multithreading task threadpool

1
推荐指数
1
解决办法
1114
查看次数

org.apache.http.conn.ConnectionPoolTimeoutException:等待来自池的连接超时

我使用Multi-thread在java中同时扫描不同的URL.如果请求时间总和超过100,000,则存在错误.我已经关闭,我应该关闭.这是我的servlet的代码

private String proyGetHttp(String url) throws ParseException, IOException,
            InterruptedException {

        String content = "";
        getMethod = new HttpGet(url);
        HttpResponse response = null;
        HttpEntity httpEntity = null;
        boolean success = false;
        while (!success) {
            System.out.println("url?" + url + "?connect...");
            try {
                response = client.execute(getMethod);
                httpEntity = response.getEntity();
                StringBuffer sb = new StringBuffer();
                if (httpEntity != null) {
                    BufferedReader in = null;
                    InputStream instream = httpEntity.getContent();
                    try {
                        in = new BufferedReader(new InputStreamReader(instream));
                        String lineContent = "";
                        while(lineContent != null){
                            sb.append(lineContent);
                            lineContent …
Run Code Online (Sandbox Code Playgroud)

connection timeout threadpool

1
推荐指数
1
解决办法
8651
查看次数

建议使我的线程池设置安全,干燥和可扩展

现在我正在产生3个线程来做一些并发工作,我使用Threadpooling进行设置,因为我希望所有线程同时运行,但是在继续之前让所有线程完成.以下是代码的要点:

_resetEvents = new ManualResetEvent[3];

_resetEvents[0] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(DoWorkA);
_resetEvents[1] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(DoWorkB);
_resetEvents[2] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(DoWorkC);

WaitHandle.WaitAll(_resetEvents);
Run Code Online (Sandbox Code Playgroud)

但是我的方法都使用相同的代码库,我把它分解为3种方法只是为了设置()正确的线程.

private void DoWorkA(object o) {
    var workerClass = new WorkerClass();
        workerClass.Process();
    _resetEvents[0].Set();
}
private void DoWorkB(object o) {
    var workerClass = new WorkerClass();
        workerClass.Process();
    _resetEvents[1].Set();
}
private void DoWorkC(object o) {
    var workerClass = new WorkerClass();
        workerClass.Process();
    _resetEvents[2].Set();
}
Run Code Online (Sandbox Code Playgroud)

显然它不是很干,因为我想拥有4个或5个线程,但是想要确保Set()在完成后设置正确的_resetEvent.

有关如何安全地做到这一点并使其更干燥和可扩展的任何建议?

c# multithreading threadpool

1
推荐指数
1
解决办法
63
查看次数

为什么我更喜欢使用 API 异步功能而不是用 Task.Run 包装同步功能?

我知道这段代码之间有区别:

var streamWriter = new StreamWriter("something.txt");
streamWriter.WriteAsync("text");
Run Code Online (Sandbox Code Playgroud)

和这个:

var streamWriter = new StreamWriter("something.txt");
Task.Run(()=> streamWriter.Write("text"));
Run Code Online (Sandbox Code Playgroud)

第一个更有意义。

在不同的情况下,当我等待结果时,此代码:

var streamReader = new StreamReader("something.txt")
char[] chars = new char[10];

Task<int> task = streamReader.ReadAsync(chars, 0, chars.Length);
//Do something...

int num = await task;
//Do something with num...
Run Code Online (Sandbox Code Playgroud)

比这更有意义:

var streamReader = new StreamReader("something.txt")
char[] chars = new char[10];

Task<int> task = Task.Run(()=>streamReader.Read(chars, 0, chars.Length));
//Do something...

int num = await task;
//Do something with num...
Run Code Online (Sandbox Code Playgroud)

我想使用内置的异步 API 不仅在清晰度上更好,而且它实际上ThreadPool比让ThreadPool线程无故等待更好、更有效地管理线程。

这样对吗?

c# asynchronous threadpool task-parallel-library async-await

1
推荐指数
1
解决办法
221
查看次数

Perl - 多线程脚本打印内存映射和回溯

在此输入图像描述当我调用我的多线程perl脚本时,在几个场景中,它会引发一些类似于以下的异常.对不起,我无法分享代码.但如果真的需要我可以尝试构建一个片段(如果确实需要).因为我猜这应该有一些理论上的答案.

*** glibc detected *** perl: double free or corruption (!prev): 0x00007f775401e9a0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3d74c75e66]
/lib64/libc.so.6[0x3d74c789b3]
/lib64/libc.so.6[0x3d74c7b880]
/lib64/libc.so.6(realloc+0xe5)[0x3d74c7baf5]
/usr/lib/../lib64/libcrypto.so.10(CRYPTO_realloc+0x5f)[0x7f775907bd8f]
/usr/lib/../lib64/libcrypto.so.10(lh_insert+0xee)[0x7f77590f763e]
/usr/lib/../lib64/libcrypto.so.10(OBJ_NAME_add+0x6b)[0x7f775907f12b]
/usr/lib/../lib64/libcrypto.so.10(EVP_add_cipher+0x27)[0x7f7759102387]
/usr/lib/../lib64/libcrypto.so.10(OpenSSL_add_all_ciphers+0x4b7)[0x7f7759106a07]
/usr/lib/../lib64/libcrypto.so.10(OPENSSL_add_all_algorithms_noconf+0xe)[0x7f775910653e]
/usr/local/lib/libssh2.so.1(libssh2_init+0x39)[0x7f77596800b9]
Run Code Online (Sandbox Code Playgroud)

为什么我会收到这样的错误?

我正在使用Thread :: Queue; 使用threads :: shared; 请让我知道你的看法.

下面是线程库版本信息.

use threads; - installed v2.15 (latest - 2.16)
use Thread::Queue; - installed v3.12 (up to date)
use threads::shared; - installed v1.56 (latest - 1.57)
perl - installed v5.26.1
Run Code Online (Sandbox Code Playgroud)

其他图书馆::

use YAML::XS 'LoadFile';  - 0.66 up to date
use Net::Netconf::Manager; - 1.02 up to date …
Run Code Online (Sandbox Code Playgroud)

scripting perl multithreading memory-management threadpool

1
推荐指数
1
解决办法
103
查看次数

线程池中的线程数

我有两个问题.. 1. 线程和线程池有什么区别?我的系统中可以有多个线程池(不是线程)吗?2.我一直在读,线程池中线程的一般大小与处理器数相同或比处理器多一个。我使用的是四核处理器,这意味着我可以在线程池中有 4 或 5 个线程。但是在任务管理器下,我的系统随时显示超过 1000 个线程处于活动状态..??

multithreading threadpool

1
推荐指数
1
解决办法
1651
查看次数

使用c#的线程和任务之间的性能比较

我试图了解使用 common Threads 和Tasks之间的好处。第一个进入System.Threading命名空间,后者进入System.Threading.Tasks命名空间。所以,只是为了玩和熟悉它们,我写了这个程序C#

class Program
{
    static void Main(string[] args)
    {
        long ticksAtStart = DateTime.UtcNow.Ticks;

        new Thread(() => { ExecuteAsyn("Thread", DateTime.UtcNow.Ticks); }).Start();
        Console.WriteLine("Using Thread: " + (DateTime.UtcNow.Ticks - ticksAtStart));

        ticksAtStart = DateTime.UtcNow.Ticks;

        Task g = Task.Factory.StartNew(() => ExecuteAsyn("TPL", DateTime.UtcNow.Ticks));
        Console.WriteLine("Using TPL: " + (DateTime.UtcNow.Ticks - ticksAtStart));

        g.Wait();
        Console.ReadKey();
    }

    private static void ExecuteAsyn(string source, long ticksAtExecutionTime)
    {
        Console.WriteLine("Hello World! Using " + source + " the difference between initialization and …
Run Code Online (Sandbox Code Playgroud)

c# multithreading task threadpool

1
推荐指数
1
解决办法
3193
查看次数

Windows 服务停留在“启动”状态以及 Thread.Sleep() 和 Task.Delay() 之间的区别

我的 Windows 服务卡在启动状态。下面是里面的代码onstart()log()将一些值记录到文件中。

while (true)
        {
            log();
            Thread.Sleep(TimeSpan.FromMinutes(5));
        }
Run Code Online (Sandbox Code Playgroud)

一些实验后,我改变了onstart()

while (true)
        {
            log();
            await Task.Delay(TimeSpan.FromMinutes(5)).ConfigureAwait(false);
        }
Run Code Online (Sandbox Code Playgroud)

一旦我更改了代码服务状态更改为正在运行并且工作正常。我认为 Thread.Sleep() 和 Task.Delay() 之间有什么区别,我认为两者都在延迟执行。谁能帮我理解

c# task threadpool

1
推荐指数
1
解决办法
57
查看次数

为什么线程池独立而不是并发地接受任务?

我试图让线程池的基础知识非常强大。我了解到它在内部使用阻塞队列来“窃取”任务并将它们运行到池中的给定线程中。这意味着如果我有 10 个任务和 5 个线程,它只能同时运行 5 个任务,直到 1 个任务完全完成。

问题是:为什么不并发?为什么不只是对这 10 个任务进行时间切片?这个实现的原因是什么?

java multithreading blockingqueue threadpool

1
推荐指数
1
解决办法
85
查看次数

在应用程序生命周期内创建的线程池的最大数量是否有限制?

考虑以下代码:

class Test {
    public static void main(String... args) {
        var t = new Test();
        while(true) {
            t.work();
        }
    }
    public void work() {
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        try {
             /* Do work */
        }
        finally {
            executorService.shutdown();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用程序的生命周期中可以有多少个线程池(不是同时)是否有限制。

我尝试查看源代码并运行此测试一段时间,但似乎没有限制。一旦线程池计数器溢出会发生什么?

java concurrency multithreading threadpool

1
推荐指数
1
解决办法
55
查看次数