java多线程计算(JAVA多线程累加)
本文目录
- JAVA多线程累加
- java写一个多线程程序,计算各种统计值的数字列表
- Java单多线程求pair值算法比较
- JAVA多线程 用两个线协作程完成1---100的加法,线程1完成1--50,线程完成51--100,运算结果却不正确
JAVA多线程累加
ExecutorService threadPool2 = Executors.newFixedThreadPool(10);ExecutorCompletionService《Integer》 executorCompletionService = new ExecutorCompletionService《Integer》(threadPool2);for (int i = 0; i 《 10; i++) {executorCompletionService.submit(new Callable《Integer》() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int j = 0; j 《 10; j++) {sum += new Random().nextInt(1000);}System.out.println("num:" + sum);return sum;}});}int sum = 0;for (int i = 0; i 《 10; i++) {try {int num = executorCompletionService.take().get();sum += num;} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}System.out.println("sum:" + sum);
java写一个多线程程序,计算各种统计值的数字列表
package com.accp.wangyou;import java.util.Arrays;public class test { final int arr = { 90, 81, 78, 95, 79, 72, 85 }; public static void main(String args) { new Thread(new test().new runnable1()).start(); new Thread(new test().new runnable2()).start(); new Thread(new test().new runnable3()).start(); } class runnable1 implements Runnable { public void run() { int avg = 0; for (int i = 0; i 《 arr.length; i++) { avg += arr; } System.out.println("平均值为:" + avg / arr.length); } } class runnable2 implements Runnable { public void run() { Arrays.sort(arr); System.out.println("最大值:" + arr); } } class runnable3 implements Runnable { public void run() { Arrays.sort(arr); System.out.println("最小值:" + arr); } }}
Java单多线程求pair值算法比较
进程和线程的概念
什么是进程
一个进程就是在一个运行的程序 它有自己独立的内存空间 一组系统资源 每个进程的内部数据和状态都是独立的 例如在window是同时打开多个记事本 虽然它们所运行的程序代码都是一样的 但是所使用的内存空间是独立的 互不干扰
什么是线程
线程与进程相似 是一段完成某个特定功能的代码 是程序中单个顺序的流控制;但与进程不同的是 同类的多个线程共享一块内存空间和一组系统资源 而线程本身的数据通常只有微处理器的寄存器数据 以及一个供程序执行时使用的堆栈
进程与线程的区别
进程:每个进程都有独立的代码和数据空间(进程上下文) 进程切换的开销大
线程:轻量的进程 同一类线程共享代码和数据空间 每个线程有独立的运行栈和程序计数器(PC) 线程切换的开销小
多进程:在操作系统中 能同时运行多个任务程序
多线程:在同一应用程序中 有多个顺序流同时执行
线程创建的两种方式
采用继承Thread类创建线程
该方法比较简单 主要是通过继承java lang Thread类 并覆盖Thread类的run()方法来完成线成的创建 Thread 类是一个具体的类 即不是抽象类 该类封装了线程的行为 要创建一个线程 程序员必须创建一个从 Thread 类导出的新类 Thread类中有两个最重要的函数run()和start()
通过实现Runnable接口创建线程
该方法通过生成实现java lang Runnable接口的类 该接口只定义了一个方法run() 所以必须在新类中实现它 但是 Runnable 接口并没有任何对线程的支持 我们还必须创建 Thread 类的实例 这一点通过 Thread 类的构造函数
public Thread(Runnable target);来实现
单线程和多线程性能比较
以使用蒙特卡罗概率算法求π为例 进行单线程和多线程时间比较
什么是蒙特卡罗概率算法
蒙特卡罗法(Monte Carlo method)是以概率和统计的理论 方法为基础的一种计算方法 将所求解的问题同一定的概率模型相联系 用电子计算机实现统计模拟或抽样 以获得问题的近似解 故又称统计模拟法或统计试验法 百度百科
蒙特卡罗求算法求π
第一步
画正方形和内切圆
第二步
变换表达式
正方形面积As=( R)^
圆的面积Ac=πR^
Ac/As=( R)^ /πR^
π= As/Ac
令P=As/Sc 则π= P
第三步
重复N次实验求平均值
在正方形区域内随机生成一个点A 若A落在圆区域内 M++
P=M/N
π= P N的取值越大 π的值越精确
java代码实现算法
N取值为 万 多线程的数为 每个线程执行 万次模拟实验
线程实现
import ncurrent CountDownLatch;
public class ProModel implements Runnable {
public int N;//随机实验的总次数
public static int M;//随机点落在圆中的次数
private int id;
private final CountDownLatch doneSignal;
OBJ semaphore;
public ProModel(int id CountDownLatch doneSignal int N OBJ semaphore ){
this id=id;
this doneSignal=doneSignal;
this N=N;
this semaphore=semaphore ;
M= ;
}
public void run(){
int tempM= ;
for(int i= ;i《N;i++){
if(isInCircle()){
tempM++;
}
}
synchronized (semaphore) {
add(tempM);
}
untDown();//使end状态减
}
public void add(int tempM){
System out println(Thread currentThread() getName());
M=M+tempM;
System out println(M);
}
//随机产生一个在正方形区域的点 判断它是否在圆中
public boolean isInCircle(){
double x=Math random();
double y=Math random();
if((x )*(x )+(y )*(y )《 )
return true;
else
return false;
}
public static int getTotal(){
return M;
}
}
多线程Main实现
import ncurrent CountDownLatch;
import ncurrent ExecutorService;
import ncurrent Executors;
public class MutliThread {
public static void main(String args) throws InterruptedException {
long begin=System currentTimeMillis();
int threadSize= ;
int N= ;
OBJ semaphore = new OBJ();
CountDownLatch doneSignal = new CountDownLatch(threadSize);
ProModel;
//设置特定的线程池 大小为threadSizde
System out println( begins! );
ExecutorService exe = Executors newFixedThreadPool(threadSize);
for(int i= ;i《threadSize;i++)
exe execute(new ProModel(i+ doneSignal N semaphore));
try{
doneSignal await(); //等待end状态变为 }catch (InterruptedException e) {
// TODO: handle exception
e printStackTrace();
}finally{
System out println( ends! );
System out println( *(float)ProModel getTotal()/(float)(threadSize*N));
}
exe shutdown();
long end=System currentTimeMillis();
System out println( used time(ms): +(end begin));
}
}
class OBJ{}
单线程Main实现
import ncurrent CountDownLatch;
import ncurrent ExecutorService;
import ncurrent Executors;
public class SingleThread {
public static void main(String args) {
long begin=System currentTimeMillis();
int threadSize= ;
int N= ;
OBJ semaphore = new OBJ();
CountDownLatch doneSignal = new CountDownLatch(threadSize);
ProModel;
//设置特定的线程池 大小为
System out println( begins! );
ExecutorService exe = Executors newFixedThreadPool(threadSize);
for(int i= ;i《threadSize;i++)
exe execute(new ProModel(i+ doneSignal N semaphore));
try{
doneSignal await(); //等待end状态变为 }catch (InterruptedException e) {
// TODO: handle exception
e printStackTrace();
}finally{
System out println( ends! );
System out println( *(float)ProModel getTotal()/(float)(threadSize*N));
}
exe shutdown();
long end=System currentTimeMillis();
System out println( used time(ms): +(end begin));
}
}
运行结果比较
lishixinzhi/Article/program/Java/gj/201311/27648
JAVA多线程 用两个线协作程完成1---100的加法,线程1完成1--50,线程完成51--100,运算结果却不正确
代码位置放错了吧。。。public void run(){ sum2=0; for(int j=begin2;j《=end2;j++){ sum2+=j; // data.setSum(sum2); //这里的代码去掉 } data.setSum(sum2); //放到这里来}
更多文章:
intuitive(intuitive和instinctive的区别)
2024年5月14日 01:21
中国卡车模拟6遨游中国2(遨游中国2怎么自己设置起点和终点)
2024年9月30日 12:02
csol战术飞刀怎么样 威力 距离如何 值得买吗?csol战术飞刀大概多少钱 韩服卖51RMB的国服大概多少
2024年2月20日 17:40
snapchat特效相机(snapchat相机特效加载黑屏)
2024年8月8日 17:25
手机qq2011老版本(手机QQ2011版本为什么老是卡机)
2024年8月20日 21:55
可以赚钱并提现到微信的游戏(挣钱游戏软件一天赚100微信提现没有广告)
2024年6月23日 13:09
oa办公系统怎么注册(怎么样在手机上登录公司的OA办公系统)
2024年10月17日 09:55