繁体   English   中英

多线程 java

[英]Multithreading java

我试图弄清楚如何在 java 中进行多线程处理。 现在,我的程序在没有并发的情况下运行良好,但我想实现多线程来帮助加快它的速度。

该程序运行一个单独的子 class 的多个对象,并且每个对象的 50% 的评估时间都花在一个仅使用一个内核而不是 8 个可用内核的进程中。 这些对象在程序中用作输入之前是完全相互独立的。

我试图通过让子类实现 Runnable 来实现多线程,然后让我的程序为每个这样的 object 使用一个线程。 这是正确的方法吗?

但是,如何处理 java 中的线程? 每次运行后我需要处理线程吗? 加入如何运作?

谢谢

不要手动管理线程,看看java中的执行器和线程池

你几乎步入正轨。 您将创建一个线程 object

 Runnable r = new MyClassImplementingRunnable();
 Thread t =  new Thread(p);
 t.start();
 t.join(); // wait for thread to die

线程 object 像任何其他 object 一样被垃圾收集,当 run 方法完成时线程本身就会死亡。 关键是你的 Runnable 的 run 方法确实必须保证返回,你的设计不能依赖于能够从外部杀死线程。

如果您将拥有大量线程,则需要等待它们全部完成,因此您可以保留已启动线程的集合,然后使用 t.join(smallNumberOfMillis) 查看其中哪些已完成。 这有点低效,所以还有其他允许线程相互通信的技术,我建议阅读这篇关于它们的文章。

@denis 还提到 Executor 和相关类在线程之上提供了更好的抽象。 如果您有兴趣了解背景知识,那么手动管理 Threads 会很有趣。 如果您只想完成工作,请遵循 Denis 的建议。

看看http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.ZFC35FDC70D5FC69D269883A82C7C7A53EZ2

构造函数采用您想要的线程数。 在这种情况下,与您的核心数量相同。

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");

这是开始多线程的好方法。

public class ThreadExample {
    public static void main(String[] args) {
        //Main thread
        System.out.println("Main thread");
        new Thread(new Runnable() {
            @Override
            public void run() {
                //This thread is independent of the main thread
                System.out.println("Inner Thread");
            }
        }).start();
    }
}

暂无
暂无

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

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