java中解分段方程_Java多线程并发程序设计-区间分割法解代数方程

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");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值