【问题标题】:Should you use runnable even if the threads are not sharing data?即使线程不共享数据,您是否应该使用 runnable ?
【发布时间】:2014-02-28 11:28:28
【问题描述】:

我一直致力于编写一个多线程的 java 程序。在我取得进展之前,我一直在思考如何才能最好地编写程序。

我阅读了可运行和线程之间的区别,以及我们应该使用什么和不应该使用什么。不过我有一个问题。即使线程不共享数据(即相同的可运行类对象),遵循可运行实现进行线程化是否很好?

我最终会创建不同的可运行对象,从而占用内存。 我的另一个想法是汇集可运行对象并更改它们持有的值并将其分配给线程。从而只有一组可运行对象,从而更好地利用内存。

示例代码:

public class MrRunnable implements Runnable {
    private String toFireUrl;

    MrRunnable(String url){
    }

    @Override
    public void run() {
        // do some function here
    }
}

public class Main {

    public static void main(String[] args) {
        // We will create 500 threads
        for (int i = 0; i < 500; i++) {
            Runnable task = new MrRunnable("some new url");
            Thread worker = new Thread(task);
            //start the thread
            worker.start();
        }
    }
} 

在这里,我正在创建一个可运行对象的新实例,并且我的线程不共享数据。 那么这种方式合理吗?还是创建一个可运行对象池并让我的线程操作它们的内容并使用它更好?

【问题讨论】:

  • @NischalHp 呃...不。 Java 代码。
  • 这一切对我来说真的像是过早的优化。池化runnable你会得到什么?保存一个或 2 个新的,但会使 GC 的工作更难。那不是您遇到性能或内存问题的地方。亲吻。
  • @m0skit0 抱歉将代码添加到问题本身。
  • premature optimization 的一个很好的例子。让它工作,然后如果你有性能问题,看看如何优化。写的时候不要开始优化。
  • @m0skit0 - 我绝对没有考虑在这里优化,我只是想知道什么是正确的方法。不想以糟糕的方式开始编写代码,尝试遵守一些规则可能会在以后帮助我,因为我正在尝试编写一个需要扩展的程序,即内存占用更少并并行运行多个进程。

标签: java multithreading runnable


【解决方案1】:

您启动的每个线程都会分配一个调用堆栈,默认大小为 1 兆字节。您创建的每个MrRunnable 分配... 24 个字节。正确看待事物会有所帮助。

【讨论】:

  • 哇,好吧,这有帮助。谢谢!因此,基于此,我宁愿创建一个基于执行程序的线程池并拥有 n 个可运行对象。这将节省我的记忆足迹。
  • 谢谢!这无疑让我对编写程序所需的方法有了清晰的认识。
  • 你能分享一些线程重用的代码示例吗?我一直用:new Thread(new RunnableTask()).start();
  • @LeosLiterak Executors.newCachedThreadPool() 是一个很好的起点。
  • 公平地说,每个主要操作系统只会在创建线程时将一两页提交到实际内存,因此只有在地址空间不足而不是内存不足的情况下,1 MB 才是问题。仍然 4kb 与 24 字节并没有那么好。
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 2011-12-27
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多