繁体   English   中英

难以理解Java线程

[英]Trouble understanding Java threads

抱歉,我从python了解了多处理的知识,在理解Java的方法时遇到了一些麻烦。 在python中,我可以说我想要一个由4个进程组成的池,然后向我的程序发送一堆工作,并且它一次可以处理4个项目。 我意识到,使用Java,我需要使用线程来完成相同的任务,到目前为止,它似乎真的工作得很好。

但是..我与python不同,我的cpu没有获得100%的利用率(它们大约为70-80%),并且我怀疑它是我创建线程的方式(python / java和程序是独立的)。 在Java中,我不确定如何创建一个线程,因此我要为要处理的列表中的每个项目创建一个线程,如下所示:

    for (int i = 0; i < 500; i++) {
        Runnable task = new MyRunnable(10000000L + i);
        Thread worker = new Thread(task);
        // We can set the name of the thread
        worker.setName(String.valueOf(i));
        // Start the thread, never call method run() direct
        worker.start();
        // Remember the thread for later usage
        threads.add(worker);
    }

我从这里拿走的。 我的问题是这是启动线程的正确方法,还是有办法让java本身来管理线程数,使其达到最佳状态? 我和我猜想的每个人一样,我希望我的代码尽可能快地运行,并且我试图理解如何分辨和解决可能由于创建过多线程而引起的任何问题。 这不是主要问题,只是对它在Java引擎下的工作方式感到好奇。

谢谢!

您使用Executor ,其实现处理一个线程池,确定线程数,依此类推。 有关许多示例,请参见Java教程

通常,除了非常简单的东西外,Java中不使用裸线程。 相反,会有一些更高级别的API接收您的Runnable或Task并知道该怎么做。

看一下Java Executor API。 例如,请参阅本文

尽管创建线程比以前要便宜得多,但是创建大量线程(如示例中的每个可运行线程)并不是可行的方法-创建它们仍然会产生开销,并且最终上下文切换过多。

Executor API允许您创建各种类型的线程池来执行Runnable任务,因此您可以重用线程,灵活地管理所创建的线程数,并避免每个可运行线程的开销。

顺便说一下,Java线程模型和Python 线程模型(不是多处理)确实非常相似。 没有像Python那样的Global Interpreter Lock,因此通常较少需要派生多个进程。

线程是“低级” API。

根据您要执行的操作以及所使用的Java版本,它们是更好的解决方案。 如果您使用Java 7,并且如果您的任务允许,则可以使用fork / join框架: http : //docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

但是,请看一下Java并发教程: http : //docs.oracle.com/javase/tutorial/essential/concurrency/executors.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM