题目来源:学堂在线_清华大学_JAVA程序设计进阶
题目描述:
基本上,本题与“使用synchronized进行线程同步”作业的区别就是:不使用synchronized,而是用可重入锁。
学员可以体会其在表象上的异同。当然,我们在课件中强调过其本质的区别以及运行效率的区别。
再重复一遍题目要求。对于每一个给定的参数,创建一个线程计算其最小质因子,并将该质因子累加到一个共享变量中。最后在主线程打印输出。
本题不提供输入输出样例,请仔细阅读源代码中的注释。
按照注释要求补全代码。
package chapter03;
import java.util.Scanner;
import java.util.concurrent.locks.ReentrantLock;
public class test01 {
//直接定义一个基本类型用于保存结果
static int result = 0;
public static void main(String[] args) {
//根据指定的方法生成输入
int[] input = getInput();
//定义一个锁的实例
final ReentrantLock lock = new ReentrantLock();
//对每一个输入的参数
//利用匿名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;
}
//在此补全代码,将n的最小质因子(即上面求出的t)累加至result
//注意做同步
/***begin your code here***/
lock.lock();
result += t;
lock.unlock();
/***end your code***/
}
}).start();
}
//主线程暂时不和子线程做任何同步,简单的等待300ms之后,直接输出result(当然这是有隐患的)
try {
Thread.sleep(300L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(result);
}
//本方法用于生成输入参数,学员可以无视
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;
}
}