public class Main { public static boolean isPrime(int n) { if(n < 2) return false; if(n == 2) return true; if(n%2==0) return false; for(int i = 3; i < n; i += 2) if(n%i == 0) return false; return true; } public static void main(String[] args) throws InterruptedException { long time1 = System.currentTimeMillis(),time2; Task task1 = new Task(1,100000); Task task2 = new Task(100001,200000); Thread thread1 = new Thread(task1); Thread thread2 = new Thread(task2); thread1.start(); thread2.start(); while (thread1.isAlive() || thread2.isAlive()){ Thread.sleep(1); } time2 = System.currentTimeMillis(); System.out.println("总耗时:"+(time2 - time1)+"毫秒"); } } class Task implements Runnable{ private int start; private int end; Task(int start, int end) { this.start = start; this.end = end; } public void run() { long time = System.currentTimeMillis(); long count = 0; for(int i=start;i<=end;++i){ if(Main.isPrime(i)) count+=i; } System.out.println(String.format("%d-%d之间质数和为%d,耗时:%d毫秒",start,end,count,(System.currentTimeMillis()- time))); } }
时间: 2024-03-07 13:51:57 浏览: 16
这段代码是一个Java程序,主要实现的功能是计算1-100000和100001-200000之间的质数和,并输出计算结果和计算耗时。这段代码通过多线程实现并行计算,加快计算速度。
程序中定义了一个Task类,实现了Runnable接口,定义了一个构造函数和一个run方法。构造函数用来初始化任务的起始和结束位置,run方法是任务的主要执行逻辑,用来计算质数和,并输出计算结果和计算耗时。
在主函数中,首先创建两个Task对象,分别用来计算1-100000和100001-200000之间的质数和。然后创建两个Thread对象,并将Task对象传入,启动两个线程。最后通过while循环来判断两个线程是否都执行完毕,如果没有执行完毕,就让主线程休眠1毫秒,等待线程执行完毕。最后输出总的计算耗时。
总的来说,这段代码通过多线程的方式来实现并行计算,加快了计算速度。但是需要注意的是,多线程并不一定比串行计算更快,需要根据具体情况来选择合适的计算方式。同时,在多线程编程中需要注意线程安全的问题。
相关问题
public class Prime { public static void main(String[] args) { Scanner in = new Scanner(System.in); int x = in.nextInt(); System.out.println(isPrime(x)); } public boolean isPrime(int n) { for (int i = 2; i <= Math.sqrt(n); i++ ) { if (n % i == 0){ return false;// Write your solution here } } return true; } }为什么这段代码会报错
这段代码会报错是因为`isPrime`方法是静态方法,而静态方法无法调用非静态方法。解决方法有两种:
1. 将`isPrime`方法也设置为静态方法:
```
public static boolean isPrime(int n) {
for (int i = 2; i <= Math.sqrt(n); i++ ) {
if (n % i == 0){
return false;
}
}
return true;
}
```
2. 创建一个`Prime`类的对象,然后调用`isPrime`方法:
```
public class Prime {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x = in.nextInt();
Prime prime = new Prime();
System.out.println(prime.isPrime(x));
}
public boolean isPrime(int n) {
for (int i = 2; i <= Math.sqrt(n); i++ ) {
if (n % i == 0){
return false;
}
}
return true;
}
}
```
import java.io.*; public class PrimeNumberWriter { public static void main(String[] args) { int lowerBound = 1; // 下限 int upperBound = 100; // 上限 String filename = "prime_numbers.dat"; // 文件名 try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(filename))) { for (int i = lowerBound; i <= upperBound; i++) { if (isPrime(i)) { dos.writeInt(i); // 将素数写入文件 } } } catch (IOException e) { e.printStackTrace(); } } // 判断是否为素数 private static boolean isPrime(int n) { if (n <= 1) { return false; } for (int i = 2; i <= Math.sqrt(n); i++) { if (n % i == 0) { return false; } } return true; } } 这段代码为什么没有输出
这段代码没有输出是因为它并没有写任何输出语句。它的作用是将1到100之间的素数写入名为“prime_numbers.dat”的文件中。如果要在控制台输出这些素数,可以在写入文件的同时在控制台输出,如下所示:
```
import java.io.*;
public class PrimeNumberWriter {
public static void main(String[] args) {
int lowerBound = 1; // 下限
int upperBound = 100; // 上限
String filename = "prime_numbers.dat"; // 文件名
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(filename))) {
for (int i = lowerBound; i <= upperBound; i++) {
if (isPrime(i)) {
System.out.println(i); // 在控制台输出素数
dos.writeInt(i); // 将素数写入文件
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 判断是否为素数
private static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
```
在这段代码中,每当发现一个素数时,它会将该素数输出到控制台,并将其写入文件。