java程序100多个线程_Java 之 应用多线程计算1+2+...+100之多种方法比较(一)

这篇博客介绍了两种在Java中使用多线程计算1到100之和的方法。首先,展示了不使用线程池的方式,通过创建10个线程并手动管理它们,将计算任务分配给每个线程。接着,介绍了使用线程池的方法,利用固定大小的线程池来执行任务,但存在顺序执行的问题。最后,讨论了如何优化线程池的执行以实现并发计算,并给出了相应的代码示例。
摘要由CSDN通过智能技术生成

一、思路1: 不使用线程池

1.run方法

定义  static int[] arr = new int[10];

将1~100 分成10个数组,分成10个线程的run()方法分别计算

其中每个线程的run方法拿到一个ix下标当作自己的数组索引

方法1:0 -> 1~10 ; 1 -> 11~20 ; 9 -> 91~100

static void call1(intix){int sum = 0;//0 -> 1~10 ; 1 -> 11~20 ; 9 -> 91~100

for (int i = ix*10+1; i <= (ix+1)*10 ; i++) {

sum+=i;

}

arr[ix]=sum;

System.out.println(Thread.currentThread().getName()+"\t"+sum);

}

方法2: 循环基础:i -> 0,10,20,30,40,50,60,70,80,90

i+ix:    0~90;1~91;... 9~99

i+ix+1:  1~91;  2~92;... 10~100

static void call2(intix){int sum = 0;//ix//0 -> 0,10,20,30,40,50,60,70,80,90//1 -> 0+1=1,10+1=11,21,31 ... 91//...//9 -> 9,19,29,39 ... 99//i 从 0,10,20,30,40,50,60,70,80,90

for (int i = 0; i < 100 ; i+=10) {//sum += i+ix;//0~90;1~91;... 9~99;

sum += i+ix+1; //1~91; 2~92;... 10~100;

}

arr[ix]=sum;

a++;

System.out.println(Thread.currentThread().getName()+"\t"+sum);

}

2.可执行的 Runnable target

static class Sum implementsRunnable{//下标ix

private intix;public Sum(intix){this.ix =ix;

}

@Overridepublic voidrun() {

call2(ix);//call1(ix);

}

}

3.mian方法测试代码

//顺序执行,没有并发 -> 解决办法 -> 加状态值a

Thread[] th = new Thread[10];for (int i = 0; i < th.length; i++) {

th[i]= new Thread(newSum(i));

th[i].start();

th[i].join();//Waits for this thread to die.

}

int sum = 0;

for (int i = 0; i

sum +=arr[i];

}

System.out.println("sum all\t"+sum);

运行结果:thread1,2,3,4,...顺序执行

优化:1)属性中增加 static int a = 0; //状态值

5e38a52023f006d721baa98e8aff9f29.png

bab6d7b087051594833753f0e1dc28f8.png

2)main方法中增加状态值的判断:

8a9f33c13b0ebb06fbad9051e4112d15.png

二、思路2:使用线程池,不需要声明arr数组

1.run()方法:

static int _call2(intix){int sum = 0;for (int i = 0; i < 100 ; i+=10) {

sum+= i+1+ix;

System.out.println(Thread.currentThread().getName()+"\t"+sum);

}returnsum;

}

2.main方法中直接执行带返回值的submit

ExecutorService service = Executors.newFixedThreadPool(10);//顺序执行,没有并发

for (int j = 0; j < arr.length; j++) {final int _j =j;

arr[j]= service.submit(new Callable() {

@Overridepublic Integer call() throwsException {// 从线程外向里面传值只能是常量

return_call2(_j);

}

}).get();

}

int sum = 0;

for (int i = 0; i

sum +=arr[i];

}

System.out.println("sum all\t"+sum);

缺陷:一个一个把返回值塞进arr[i]中,没有并发,依然顺序

优化:1)不需要线程的get()返回值,直接放进属性中的arr[i]

2) 使用状态值a

//线程池 + 并发

for (int j = 0; j

service.submit(newSum(j));

}while (a<10){

Thread.sleep(100);

}int sum = 0;for (int i = 0; i

sum+=arr[i];

}

System.out.println("sum all\t"+sum);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值