何时使用线程,何时使用线程池?

3

有人能帮我解释一下线程和线程池的区别吗?哪一个更好用?它们各自的缺点是什么?

我在这个例子中使用了线程池,而在这种情况下使用它是正确的还是错误的?

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

class ThreeThread implements Runnable {

    String c;
    Semaphore s1;
    Semaphore s2;

    public ThreeThread(String s, Semaphore s1, Semaphore s2) {
        this.c = s;
        this.s1 = s1;
        this.s2 = s2;
    }

    @Override
    public void run() {
        while (true) {
            try {
                s1.acquire();
                Thread.sleep(400);
                System.out.println(c);
                s2.release();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                System.out.println(e);
            }
        }
    }

    public static void main(String[] args) {
        Semaphore sm1 = new Semaphore(1);
        Semaphore sm2 = new Semaphore(0);
        Semaphore sm3 = new Semaphore(0);

        ExecutorService es = Executors.newFixedThreadPool(3);

        es.execute(new ThreeThread("1", sm1, sm2));
        es.execute(new ThreeThread("2", sm2, sm3));
        es.execute(new ThreeThread("3", sm3, sm1));
    }
}

2
线程很耗费资源,即创建成本高昂。您可以使用线程来处理长时间运行的进程。如果有许多小任务,则可以使用线程池。该池仅一次分配线程并重复使用它们以避免不必要的线程创建。关于您的示例:请修复缩进。解释一下程序的预期功能会很有帮助。我看到了一些线程之间的同步。您应该避免在线程池中发生这种情况,因为可能会遇到线程饥饿问题。 - Turing85
2
感谢您的解释,但是我无法理解关于修复缩进的部分.....? - Abdo Bmz
1
看一下你的 try 块。 - Turing85
最佳实践是尽可能使用一些框架来处理同步。 - Bogdan Lukiyanchuk
1
对于感兴趣的读者:JDK团队正在开发一种更轻量级的并行模型,称为Project Loom - Turing85
显示剩余2条评论
3个回答

3
请参阅ThreadPoolExecutor文档:
线程池解决了两个不同的问题:
它们通常可以提高执行大量异步任务时的性能,因为每个任务的调用开销减少了,
并且它们提供了一种限制和管理资源(包括线程)的手段,在执行一组任务时消耗这些资源。
每个ThreadPoolExecutor还维护一些基本统计信息,例如已完成任务的数量。

1
@Shn_Android_Dev 我相信这个问题可以帮到你。https://dev59.com/6G035IYBdhLWcg3wVud1 - xingbin

-1

嗯,我认为ThreadPoolExecutor提供更好的性能,因为它管理了一组线程,最小化了实例化新线程和分配内存的开销...

如果你要启动成千上万的线程,它会给你一些排队功能,这些功能你自己需要编程实现...

线程和执行器是不同的工具,用于不同的场景...就像问为什么我应该使用ArrayList而不是HashMap一样?它们是不同的...


-1
何时使用: 线程:我想自己管理线程的创建时间、监控、同步和清理。 执行器:我希望专家/经理来执行这些活动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接