开发者

Manually Increasing the Amount of CPU a Java Application Uses

开发者 https://www.devze.com 2023-02-04 17:45 出处:网络
I\'ve just made a program with Eclipse that takes a really long time to execute. It\'s taking even longer because it\'s loading my CPU to 25% on开发者_StackOverflow社区ly (I\'m assuming that is becaus

I've just made a program with Eclipse that takes a really long time to execute. It's taking even longer because it's loading my CPU to 25% on开发者_StackOverflow社区ly (I'm assuming that is because I'm using a quad-core and the program is only using one core). Is there any way to make the program use all 4 cores to max it out? Java is supposed to be natively multi-threaded, so I don't understand why it would only use 25%.


You still have to create and manage threads manually in your application. Java can't determine that two tasks can run asynchronously and automatically split the work into several threads.


This is a pretty vague question because we don't know much about what your program does. If your program is single-threaded, then no number of cores on your machine is going to make it run any faster. Java does have threading support, but it won't automatically parallelize your code for you. To speed it up, you'll need to identify parts of the computation that can be run in parallel with one another and add code as appropriate to split up and reconstitute the work. Without more info on what your program does, I can't help you out.

Another important detail to note is that Java threads are not the same as system threads. The JVM often has its own thread scheduler that tries to put Java threads onto actual system threads in a way that's fair, but there's no actual guarantee that it will do so.


Yes, Java is multi-threaded, but the multi-threading doesn't happen "by magic".

Have a look at either at the Thread class or at the Executor framework. Essentially you need to split your job into "subtasks" each of which can run on a single processor, then do something like this:

Executor ex = Executors.newFixedThreadPool(4);
while (thereAreMoreSubtasksToDo) {
  ex.execute(new Runnable() {
    public void run() {
      ... do subtask ...
    }
  });
}

Turning a serial routine/algorithm into a parallel one isn't necessarily trivial: you need to know in particular about a range of issues broadly termed "thread-safety". You may be interested in some material I've written about thread-safety in Java, and threading in general if you follow the links: the key thing to bear in mind is that if any data/objects are being shared among the different threads running, then you need to take special precautions. That said, for independent things that you just want to "run at the same time", then the above pattern will get you started.


Java is multi-threaded but if your application runs in only one thread, only one thread will be used. (Apart from the internal threads Java uses for finalization, garbage collection and so on.)

If you want your code to use multiple threads, you have to split it up manually, either by starting threads by yourself or using a third party thread pool. I'd suggest the latter option as it's safer but both can work equally well.


You've got a bit of learning ahead of you (actually, quite a bit of learning) - but it's learning you should do if you are going to be doing any serious programming.

Here's a starting point: http://download.oracle.com/javase/tutorial/essential/concurrency/

But you might want to look into a good book on Java multi-threading (I did this so long ago that any book I could recommend would be out of print). This sort of hard topic is well suited for learning from a text instead of online tutorials.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号