当前位置: 首页 > 知识库问答 >
问题:

Java实际上并行运行线程吗

慕学海
2023-03-14

我创建了两个类来计算数字,其中一个类同步执行,另一个类将其分成两半,并在两个线程中执行这两半。(intel i5(4个CPU),8GB ram)代码如下:

公共类:

class  Answer{
long ans = 0L;}

多线程执行:public class Sheet2{

public static void main(String[] args) {

    final Answer ans1 = new Answer();
    final Answer ans2 = new Answer();


    Thread t1 = new Thread(new Runnable() {

        @Override
        public void run() {
            for(int i=0;i<=500000; i++) {
                ans1.ans = ans1.ans + i;
            }
        }
    });

    Thread t2 = new Thread(new Runnable() {

        @Override
        public void run() {
            for(int i=500001;i<=1000000; i++) {
                ans2.ans = ans2.ans + i;
            }
        }
    });
    long l1 = System.currentTimeMillis();

    try {
        t1.start();t2.start();
        t1.join();
        t2.join();
        long l2 = System.currentTimeMillis();
        System.out.println("ans :" + (ans1.ans + ans2.ans) +" in "+(l2-l1) +" milliseconds"); 
    } catch (InterruptedException e) {
        e.printStackTrace();
    }


}
public static void main(String[] args) {

    final Answer ans1 = new Answer();

    long l1 = System.currentTimeMillis();

    for(int i=0;i<=1000000; i++) {
        ans1.ans = ans1.ans + i;
    }
    long l2 = System.currentTimeMillis();

    System.out.println("ans :" + (ans1.ans ) +" in "+(l2-l1) +" milliseconds"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

}

共有1个答案

逄岳
2023-03-14

简而言之,是的,它确实在单独的线程上运行。您可以通过创建100个线程并在process explorer中检查来测试它,它将显示为100个线程。此外,您可以在每个线程中进行一些计算,您将看到您的多核处理器达到100%的使用率。

thread.CurrentThread给出当前运行的线程。当您启动程序时,您正在“主”线程上运行。一旦开始一个新线程

新线程(myRunnable);

 类似资料:
  • 到目前为止,我的印象是,在同一时间启动的两个线程也是并行执行的(两个线程都在同一时间运行它们的代码段),但我最近阅读了一些文档,我了解到它们实际上轮流执行它们的代码,因此第一个线程的代码段与第二个线程的代码段在同一时间执行是不存在的。我的理解正确吗? 如果是,那么多线程执行比单线程执行快多少?我这么问是因为唯一的区别是单线程顺序执行代码,而多线程可以轮流执行,但仍然需要相同的时间,因为它不是并行执

  • 问题内容: 到目前为止,据我了解:Javascript是单线程的。如果您推迟执行某些过程,则只需将其安排(排队)在线程空闲时下次运行。但是Async.js定义了两种方法:和,我引用: 并行(任务,[回调]) 并行运行一系列功能,而无需等到上一个功能完成。如果任何函数将错误传递给其回调… parallelLimit(任务,限制,[回调]) 与并行执行相同,仅并行执行任务,任何时候最多执行“限制”任务

  • 问题内容: 您将如何依次执行三个线程?例如。线程1,线程2,线程3。不可能将一个线程的引用传递给另一个线程并从run()方法调用。 因此代码应如下所示: 并应该把 这可以通过使用ThreadPoolExecutor并使用阻塞队列来实现,但即使那样也不是可以接受的答案。 问题答案: 在java.util.concurrent包中使用ExecutorService。更精确地使用

  • 问题内容: 我有一个线程,需要每10秒执行一次。该线程包含对另一台服务器上的数据库的多次调用(12-15)。此外,它还可以访问大约3个文件。因此,将有大量的IO和网络开销。 执行上述操作的最佳策略是什么? 一种方法是将sleep方法与while循环一起使用,但这将是一个糟糕的设计。 在这种情况下,类似于Timer的类会有所帮助吗?另外,最好创建几个更多的线程(一个用于IO,一个用于JDBC),而不

  • 问题内容: 我正在使用javax.swing.Timer安排和运行事件。但是它似乎冻结了GUI。只是想知道这些事件是在单独的线程上运行还是我自己必须执行。 谢谢 问题答案: “尽管所有计时器都使用一个共享线程(由执行的第一个计时器对象创建)执行等待,但计时器的动作事件处理程序在另一个线程(事件调度线程)上执行。这意味着计时器的动作处理程序可以安全地在Swing组件上执行操作。但是,这也意味着处理程

  • 并行 理论上并行和语言并没有什么关系,所以在理论上的并行方式,都可以尝试用Rust来实现。本小节不会详细全面地介绍具体的并行理论知识,只介绍用Rust如何来实现相关的并行模式。 Rust的一大特点是,可以保证“线程安全”。而且,没有性能损失。更有意思的是,Rust编译器实际上只有Send Sync等基本抽象,而对“线程” “锁” “同步” 等基本的并行相关的概念一无所知,这些概念都是由库实现的。这