我需要写两个程序。 1顺序(完成)和1并行,我做了一些事情,但我不知道我是否使它并行,我也需要知道:
以下是我的代码:
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();
}
}
答案 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?
关于处理器关联性,您可以查看帖子:
http://tools.assembla.com/Behemoth/browser/Tests/JAVA/test/src/main/java/test/threads/ThreadAffinity.java(由BegemoT撰写)
但是你应该避免这些类型的事情,并专注于业务逻辑。
如何生成错误消息(内存一致性错误等)
您可以轻松生成内存一致性错误。
不要使用synchronized
或Lock
等线程安全构造来保护您的代码,并允许多个线程更新您的类中的数据。
查看此文档page
有关更好地理解多线程概念的信息,请参阅documentation链接。