import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
private static int n = 4;//线程数
private static double initStart = 2;//区间初始起点
private static double initEnd = 4;//区间初始终点
private static int num = 100000;//区间划分个数
private static MyTask myTask = new MyTask();
public static double f(double x) {
return x * x * x - 4.0 * x * x + 3.0 * x - 6.0;//有一零点位于(3,4)之间,在(3,+∞)单增
}
public static boolean isSameSymbol(double x1, double x2) {
double f1 = f(x1), f2 = f(x2);
return ((f1 > 0 && f2 > 0) || (f1 < 0 && f2 < 0)) ? true : false;
}
public static class MyThread implements Runnable{
private int threadId;
public MyThread(int threadId) {
this.threadId = threadId;
}
@Override
public void run() {
System.out.println(threadId+" is start working.......");
myTask.calculate(threadId);
}
}
private static class MyTask {
private double len = initEnd - initStart;
private double dx = len * 1.0 / num;
private boolean flag = false;//是否找到满足解的区间
private double x[] = new double[n];//不同线程的区间分割线
private double prex[] = new double[n];//当前区间分割线的前一条分割线
public void calculate(int threadId){
try {
for(int i= threadId + 1; i <= num && !flag; i = i + n){
prex[threadId] = initStart + (i-1) * 1.0 * dx;
x[threadId] = initStart + i * 1.0 * dx;
if(!isSameSymbol(prex[threadId],x[threadId])){//若相邻分割线对应函数的符号不同则存在零点,并打印区间
flag = true;
System.out.println("零点所在区间:("+prex[threadId]+","+x[threadId]+")");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(n);//定义n个线程的线程池
for(int i = 0; i < n; i++){
executorService.execute(new MyThread(i));//添加线程任务
}
executorService.shutdown();
System.out.println("end");
}
}