import java.util.*; public class main{ public static void main(String[] args) { int sum=0; for(int i=1;i<=4;i++){//通过循环,建立四个线程 Cul cul=new Cul(i);//建立子类对象,用i标识本线程应当执行的是第几段加和 Thread thread=new Thread(cul);//创建Tread对象,引用子类对象。 thread.start(); try { thread.join(); /*虽然原意是通过循环变量来控制线程们的顺序,但是达不到预期效果。 于是通过i来控制抢占顺序,让四个线程顺序进行。*/ } catch (InterruptedException e) {} //join方法存在异常现象,所以要try catch 抛出一下。 sum=cul.getSum(); } System.out.println(sum); } } class Cul extends Thread{ private int num; private static int sum=0; public Cul(){} public Cul(int num){ this.num=num; } public void run(){//重写run方法。 for(int i=25*(num-1)+1;i<=num*25;i++){ sum+=i; } //System.out.println(num+"**"+sum); } public int getSum(){ return sum; } }
时间: 2023-06-15 13:08:11 浏览: 191
这段代码实现了一个多线程计算1到100的和,将任务分成四段分别由四个线程执行,最后汇总结果。其中Cul类是继承自Thread的子类,实现了run()方法,通过传入的num参数标识该线程要计算的是哪一段的和,每个线程计算完后将结果累加到静态变量sum中,最后通过getSum()方法获取sum的值,最终输出结果。在主函数中,通过循环建立四个线程,依次执行并等待执行完毕,最后汇总结果,输出到控制台。
相关问题
package sy5; import java.util.*; public class Main { public static void main(String args[]) { String st; Scanner sc=new Scanner(System.in); st=sc.nextLine(); int i; String x[]=st.split(";"); for(i=0;i<x.length;i++) { System.out.print(x[i]+"\n"); } int sum=0; for(String j:x) { String x1[]=j.split(": "); int price = Integer.parseInt(x1[1].trim()); sum += price; } System.out.println(sum); } }非零返回,请修改代码
在这段代码中,非零返回是因为可能会出现没有输入任何内容的情况,此时直接调用 `nextInt()` 或 `nextLine()` 方法会出现异常。为了避免这种情况,需要在读取输入之前进行检查,可以使用 `hasNextLine()` 方法判断是否还有输入可读取。修改后的代码如下所示:
```
package sy5;
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
if (!sc.hasNextLine()) {
System.out.println("输入为空!");
return;
}
String st = sc.nextLine();
int i;
String x[] = st.split(";");
for (i = 0; i < x.length; i++) {
System.out.print(x[i] + "\n");
}
int sum = 0;
for (String j : x) {
String x1[] = j.split(": ");
int price = Integer.parseInt(x1[1].trim());
sum += price;
}
System.out.println(sum);
}
}
```
import java.util.stream.IntStream; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a = in.nextInt(); int b = in.nextInt(); int[] r = IntStream.range(a, b). filter( ). toArray(); for ( int x : r ) { System.out.print(x+" "); } System.out.println(); in.close(); } }
这段代码中,缺少 `filter()` 方法的实现。根据题意,我们需要筛选出 [a,b) 之间的所有完全数。
可以使用 lambda 表达式来实现 `filter()` 方法。具体来说,我们可以使用 `IntStream.range(a, b)` 得到一个从 `a` 到 `b-1` 的整数流,然后在流上使用 `filter()` 方法,传入一个 lambda 表达式,用来判断一个整数是否为完全数。如果是,则该整数被保留在流中,否则被过滤掉。最后使用 `toArray()` 方法将流转换为一个整数数组。
在 lambda 表达式中,我们可以利用 `isPerfect()` 方法来判断一个整数是否为完全数。`isPerfect()` 方法的实现可以参考上一个问题的解答。
修改后的代码如下:
```java
import java.util.stream.IntStream;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
int[] r = IntStream.range(a, b)
.filter(Main::isPerfect)
.toArray();
for (int x : r) {
System.out.print(x + " ");
}
System.out.println();
in.close();
}
public static boolean isPerfect(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
sum += i;
}
}
return sum == n;
}
}
```
这段代码中,我们将 `isPerfect()` 方法定义为静态方法,并使用 `Main::isPerfect` 的方式将其作为 lambda 表达式传入到 `filter()` 方法中。在 `isPerfect()` 方法中,我们使用与上一个问题相同的方法来计算一个整数的因子之和。如果该和等于该整数,则返回 `true`,否则返回 `false`。