我是编程的初学者,需要一些帮助和建议

时间:2017-03-24 10:19:01

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

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

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

    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();
        }
    }
    

2 个答案:

答案 0 :(得分:3)

  

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

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

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

我无法知道Thread.State是否与您所说的内容相对应&#34; status&#34;,但调用Thread.currentThread().getState();不会产生任何信息,因为任何线程的状态始终为{ {1}}正在调用RUNNABLE

  

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

我打赌你不要。

您所询问的是&#34;处理器亲和力。&#34;大多数程序依赖于操作系统来自动调度可用CPU上的可运行线程。它只是非常复杂的程序(注意,#34;复杂的&#34;并不总是等于#34;良好&#34;)需要修补它。

没有标准方法来设置Java线程的CPU关联性,但可能有一些方法可以在特定的操作系统上使用。你可以google&#34; Java处理器亲和力&#34;了解更多信息。

  

[我需要知道]如何显示处理器的状态

你必须解释什么&#34;状态&#34;意味着什么处理器,以及什么时候?

取决于&#34;状态&#34;意思是,如果你编写代码来询问&#34; status&#34;在代码运行的同一个处理器上,那么答案可能永远不会改变。就像getState()的结果永远不会改变一样。

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

  

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

最简单的方法是使用Thread.currentThread().getState()System.out.println(...)

也许你真的想问别的东西,比如如何知道何时报告错误,或者如何处理异常。

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

答案 1 :(得分:0)

  

如何将不同的线程分配给不同的处理器(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链接。