本帖最后由 lin9118 于 2013-07-29 16:09:29 编辑

解决方案 »

  1.   

    两个对象两个线程,控制一个类的结果:package com;public class Test3 extends Thread{
    XX xx;
    int start;
    public Test3(XX xx,int start){
    this.xx=xx;
    this.start=start;
    }


    public void run(){
    int num=0;
    for(int i=start;i<start+500;i++){
    num+=i;
    }
    if(this.start==0){
    xx.setNum1(num);
    xx.setFlag1(true);
    }else if(this.start==500){
    xx.setNum2(num);
    xx.setFlag2(true);
    }
    if(xx.isFlag1()&&xx.isFlag2()){
    System.out.println(xx.getNum1()+xx.getNum2());
    }
    }

    public static void main(String[] args) {
    XX xx=new XX();
    new Test3(xx, 0).start();
    new Test3(xx, 500).start();
    }}class XX{
    public int num1=0;
    public int num2=0;
    public boolean flag1=false;
    public boolean flag2=false;


    public int getNum1() {
    return num1;
    }
    public void setNum1(int num1) {
    this.num1 = num1;
    }
    public int getNum2() {
    return num2;
    }
    public void setNum2(int num2) {
    this.num2 = num2;
    }
    public boolean isFlag1() {
    return flag1;
    }
    public void setFlag1(boolean flag1) {
    this.flag1 = flag1;
    }
    public boolean isFlag2() {
    return flag2;
    }
    public void setFlag2(boolean flag2) {
    this.flag2 = flag2;
    }

    }
      

  2.   

    Quote: 引用 2 楼 rumlee 的回复:

    肯定可以实现,只是所用的时间肯定不是单线程时间的一半,可能比单线程时间花的还要多得多。
    这是因为你这个问题计算量太小了,在计算上花的时间太少了,而启动线程以及在线程同步上花的时间远远超过计算的时间。而且你这里也不一定能够绝对保证两个线程并行执行,因为有可能在第二个线程还没有启动起来,第一个线程就已经执行完成了。最终可能还是顺序执行的。那个1000只是一个举例!那就是说无法实现两个线程并行执行了?
      

  3.   

    给增加操作做一个SLEEP 不然看不出效果 就如2楼说的 多线程反而慢了
    package a.b.test;import java.util.Date;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;public class Calculate1000  implements Callable<Integer>{
    public Calculate1000(){}

    public Calculate1000(int a, int b){
    this.a = a;
    this.b = b;

    }

    int a;
    int b;

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
    //同步
    Calculate1000 ca1 = new Calculate1000();
    Date ds1 = new Date();
    int result = 0;
    for(int i = 1 ; i <= 1000 ; i++){
    result = ca1.add(i, result);
    }
    System.out.println(result);
    System.out.println("同步用时" + (new Date().getTime() - ds1.getTime()) + "MS");

    //异步
    Date ds2 = new Date();
    result = 0;
    ExecutorService es = Executors.newFixedThreadPool(2);
    Future<Integer> future1 = es.submit(new Calculate1000(1,500));
    Future<Integer> future2 = es.submit(new Calculate1000(501,1000));
    result = future1.get() + future2.get();
    System.out.println(result);
    System.out.println("异步用时" + (new Date().getTime() - ds2.getTime()) + "MS");
    es.shutdown();
    } private int add(int a, int b) throws Exception{
    Thread.sleep(10);
    return a + b;
    } @Override
    public Integer call() throws Exception {
    int res = 0;
    for(int i = a ; i <= b ; i++){
    res = this.add(res, i);
    }
    return res;
    }
    }