我正在尝试弄清楚如何在java中使用多线程。现在,我的程序在没有并发的情况下工作得很好,但我想实现多线程来帮助加速它。
该程序运行多个单独子类的对象,每个对象50%的时间评估花费在仅使用一个核心而不是8个可用核心的进程中。这些对象在之前是完全独立的,但在程序中用作输入。
我试图通过让子类实现Runnable来实现多线程,然后让我的程序为每个这样的对象使用一个线程。这是正确的方式吗?
然而,java中的线程是如何处理的呢?我需要在每次运行后处理线程吗?join是如何工作的?
谢谢
发布于 2011-07-21 14:54:31
不要手动管理线程,看看java中的executors and thread pools
发布于 2011-07-21 14:50:32
你已经走上正轨了。您将创建Thread对象
Runnable r = new MyClassImplementingRunnable();
Thread t = new Thread(p);
t.start();
t.join(); // wait for thread to dieThread对象像任何其他对象一样被垃圾回收,当run方法完成时,线程本身就会死亡。关键是你的Runnable的run方法确实必须保证返回,你的设计不能依赖于能够从外部杀死线程。
如果您有许多线程,则需要等待它们全部完成,因此您可以保留已启动的线程的集合,然后使用t.join( smallNumberOfMillis)查看哪些线程已经完成。这有点低效,所以还有其他允许线程相互通信的技术,我建议阅读有关它们的this article。
@denis还提到Executor和相关类在Thread之上提供了更好的抽象。如果你对学习背景感兴趣,那么手动管理线程是很有趣的。如果你只是想把工作做完,那就听从丹尼斯的建议。
发布于 2011-07-21 15:02:46
看一看http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html
构造函数接受您想要的线程数。在这种情况下,与您的核心数量相同。
ScheduledThreadPoolExecutor s = new ScheduledThreadPoolExecutor(8);
List<Future> futures = new ArrayList<Future>();
foreach(...something...)
futures.add(s.submit(new MyCallable()));
foreach(Future f : futures)
f.get(); // Result of computation
System.out.println("Done");https://stackoverflow.com/questions/6772236
复制相似问题