【问题标题】:I'm a very beginner at programming and need some help and advice我是编程的初学者,需要一些帮助和建议
【发布时间】:2017-03-24 10:19:00
【问题描述】:

我需要编写两个程序。 1 个顺序(完成)和 1 个并行,我做了一些事情,但我不知道我是否让它并行,我也需要知道:

  1. If (Thread.State state = Thread.currentThread().getState();) 是显示线程状态的代码
  2. 如何将不同的线程分配给不同的处理器(4 核)
  3. 如何显示处理器的状态
  4. 每个处理器的计算
  5. 如何生成错误消息(内存一致性错误等)

以下是我的代码:

class Threads implements Runnable {

    @Override
    public void run() {

        Thread t = Thread.currentThread();

        Thread.State state = Thread.currentThread().getState();
        String Assignment = "calculations in array";
        String name = "os.name";
        String version = "os.version";
        String architecture = "os.arch";
        String[] array = new String[1312500];
        int size = array.length;

        Random r = new Random();
        int[] values = new int[1312500];
        int sumarray = 0;
        int CountD = 0;

        for (int i = 0; i < values.length; i++) {
            int randomint = r.nextInt(100);

            values[i] = randomint;

            if ((values[i] % 2 != 0) && (values[i] >= 25 && values[i] <= 75)) {
                sumarray += values[i];
                CountD++;
            }
        }

        System.out.println(t.getName());
        System.out.println("Thread Id " + t.getId());
        System.out.println("Thread Priority " + t.getPriority());
        System.out.println("status " + state);
        System.out.println("OS Name: " + System.getProperty(name));
        System.out.println("OS Version: " + System.getProperty(version));
        System.out.println("OS Architechture: " + System.getProperty(architecture));
        System.out.println(Assignment);
        System.out.println("Size of the Array is: " + array.length);
        System.out.println("Total number of system cores(processors): " + Runtime.getRuntime().availableProcessors());
        System.out.println("Difference of Array and Processors 1312500/4 = "
                + array.length / Runtime.getRuntime().availableProcessors());
        System.out.println("The size of array is divisible by the number of processors");
        System.out.println("Summary is: " + sumarray);
        System.out.println("The Average is: " + (sumarray / CountD));
    }

}

主类:

class Concurrent {

    public static void main(String[] args) {
        Thread t1 = new Thread(new Threads());
        t1.start();

        Thread t2 = new Thread(new Threads());
        t2.start();

        Thread t3 = new Thread(new Threads());
        t3.start();

        Thread t4 = new Thread(new Threads());
        t4.start();
    }
}

【问题讨论】:

  • 您需要在谷歌上搜索有关线程和 Java 的教程并从那里开始。祝你好运。
  • 做了很多,但仍然感到困惑,甚至找不到与我的需求相关的任何东西。
  • 您好,欢迎来到 Stackoverflow。请阅读tourguide,了解如何以正确的方式提问以及 stackoverflow 的工作原理。
  • 寻求帮助是否太过分了,我不会告诉别人为我做我的工作
  • 我(也许其他人也是)尝试想象您的问题背后的基本原理,并忍不住建议您学习 Java、线程、操作系统和 CPU 方面的知识

标签: java arrays multithreading parallel-processing cpu-cores


【解决方案1】:

[我需要知道]Thread.State state = Thread.currentThread().getState();是否是显示线程状态的代码。

这声明了一个名为state 的变量,并使用执行它的线程的状态 对其进行初始化。 (https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html

该代码 sn-p 不显示任何内容,但随后的 System.out.println("status " + state); 会将状态表示写入控制台。

我无法知道Thread.State 是否对应于您所说的“状态”,但调用Thread.currentThread().getState(); 不会产生任何信息,因为任何线程的状态在调用RUNNABLE 时始终为RUNNABLE .

[我需要知道]如何将不同的线程分配给不同的处理器

我打赌你不会。

您所询问的内容称为“处理器关联性”。大多数程序依赖于操作系统在可用 CPU 上自动调度可运行线程。只有非常复杂的程序(请注意,“复杂”并不总是等于“好”)需要对其进行修补。

没有标准方法来设置 Java 线程的 CPU 亲和性,但可能有一些方法可以在您的特定操作系统上使用。您可以在 Google 上搜索“Java 处理器亲和性”以获取更多信息。

【我要知道】如何显示处理器的状态

您将不得不解释“状态”的含义,以及哪个处理器以及何时?

根据“状态”的含义,如果您编写代码来询问运行代码的同一处理器的“状态”,那么答案可能永远不会改变。就像Thread.currentThread().getState() 的结果永远不会改变一样。

处理器“状态”是大数据中心的系统管理员喜欢在图表上看到的那种东西,但它们很少在程序中有用,除非你再次做一些非常复杂。

[我需要知道]如何生成错误消息。

最简单的方法是使用System.out.println(...)System.err.println(...)

也许您真的想问其他问题,例如如何知道何时报告错误,或者如何处理异常。

当出现问题时,大多数 Java 库例程都会抛出异常。在这种情况下,您所要做的就是完全忽略它。如果您不编写任何代码来处理异常,那么您的程序将自动打印错误消息并在抛出异常时停止。

【讨论】:

  • “我打赌你不会”得到我的支持。这里有很大的耐心和克制。
  • @james large 我仍然没有得到任何东西,但处理器 Affinity 是百万富翁 答案正在搜索十天,但无法获得该术语,但仍然请你告诉我是我做的吗并行过程与否(是或否)
  • @MoizFarooqui,您的程序启动了四个线程。这四个线程中的每一个都运行同一个Threads 类的实例;并且由于类构造函数不带参数,因此四个线程中的每一个都将执行与其他线程完全相同的事情。是的,它们将同时运行,但我怀疑它们可能没有按照您的意图进行。通常,不同的线程要么做不同的事情,要么对不同的数据做同样的事情。您的线程都对相同的数据执行相同的操作。
【解决方案2】:

如何将不同的线程分配给不同的处理器(4 核)

让我们把这个决定留给 java 运行时。从程序员的角度来看,尝试使用您可以使用的功能。

要有效利用 CPU 内核,请查看以下问题:

Java: How to scale threads according to cpu cores?

关于处理器亲和性,您可以查看帖子:

Java thread affinity

http://tools.assembla.com/Behemoth/browser/Tests/JAVA/test/src/main/java/test/threads/ThreadAffinity.java(由 BegemoT 编写)

但是您应该避免这些类型的事情并专注于业务逻辑。

如何生成错误消息(内存一致性错误等)

您很容易产生内存一致性错误。

不要使用synchronizedLock 之类的线程安全构造来保护您的代码,并允许多个线程从您的类中更新数据。

看看这个文档page

请参阅documentation 链接以更好地理解多线程概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2021-01-09
    • 1970-01-01
    • 2021-04-11
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-31
    相关资源
    最近更新 更多