用SYNCHRONIZED修饰方法实现线程同步

本题要求实现一个多线程Java程序,该程序能够计算一组正整数的最小质因子之和。通过创建多个子线程分别计算每个输入数字的最小质因子,并将结果累加到一个共享变量中。

题目来源:学堂在线_清华大学_JAVA程序设计进阶

 

题目描述:

给定若干个正int,求这些正整数的最小质因子之和。1的最小质因子就认为是1。

特别的,程序要求为每一个参数创建一个子线程,并在该子线程中求出其最小质因子。

并将这个质因子累加到一个指定的变量中。

主线程最后会输出该指定变量,作为结果。

学员的任务就是补全Result类的代码,使得整个程序能够正确执行。

具体而言,学员需要正确的设计Result类的私有成员变量以及若干公有成员方法,同时——也是本题的最主要的目标——注意正确使用同步机制。

本题不提供输入输出样例,请仔细阅读源代码中的注释。

按照注释要求补全代码。

 

package chapter02;

import java.util.Scanner;

class Result {

//本题学员的任务就是补全Result类,使整个程序能够正确的运行

    /***begin your code here***/

    private int num;

    public Result(int num) {
        this.num = num;
    }

    synchronized public void addValue(int v) {
        this.num += v;
    }

    public int getValue() {
        return this.num;
    }

/***end your code***/
}

public class test01 {

    public static void main(String[] args) {

        //根据指定的方法生成输入

        int[] input = getInput();

        //定义一个Result实例,用于保存计算结果
        final Result result = new Result(0);

        //对每一个输入的参数
        //利用匿名Thread与匿名Runnable创建并执行一个子线程
        for (final int n : input) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //此处求取n的最小质因子,如果n是1,认为答案就是1
                    int t = 1;
                    for (int i = 2; i != n + 1; ++i)
                        if (0 == n % i) {
                            t = i;
                            break;
                        }
                    //t就是答案,将t累加进result
                    result.addValue(t);
                }
            }).start();
        }

        //主线程暂时不和子线程做任何同步,简单的等待300ms之后,直接输出result(这样做当然是由隐患的)
        try {
            Thread.sleep(300L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(result.getValue());
    }

    //本方法用于生成输入参数,学员可以无视
    private static int[] getInput() {
        Scanner cin = new Scanner(System.in);
        int a = cin.nextInt();
        int b = cin.nextInt();
        int m = cin.nextInt();
        int x = cin.nextInt();
        cin.close();

        int[] ret = new int[100];
        for (int i = 0; i != 100; ++i) {
            x = (a * x + b) % m;
            ret[i] = x;
        }
        return ret;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值