java如何能让各个线程做不同的工作?比如我建立了两个线程,线程1求和,线程2打印和。我的代码如下。
现在有两个问题:1:让线程做不同的工作都有什么样的手段可以实现
                2: 为什么我打印出来的sum总是0。sum类变量,两个线程共用这个类变量,那么线程1进行加操作的时候,sum至少应该有变化呀。         package Thread;class MyRun implements Runnable{
private String job;
private int sum= 0;

public MyRun(String str){
job = str;
}

public void run(){
while(true){
if(job.equals("add")){
sum+=10;
System.out.println("add sum");
try{
Thread.sleep(1000);
}catch(InterruptedException e){
System.out.println(e.getMessage());
}
}
else if(job.equals("print")){
System.out.println("The sum is :"+sum);
try{
Thread.sleep(2000);
}catch(InterruptedException e){
System.out.println(e.getMessage());
}
}
}
}
}public class TwoJob{
public static void main(String[] args){
MyRun addSum = new MyRun("add");
MyRun printSum = new MyRun("print");
new Thread(addSum).start();
new Thread(printSum).start();
}
}      

解决方案 »

  1.   

    两个线程,两个资源,互相之间没有任何影响
    MyRun addSum = new MyRun("add");
    MyRun printSum = new MyRun("print");
    new Thread(addSum).start(); //这个线程会一直调用addSum的run,会一直进行sum+10
    new Thread(printSum).start(); //这个线程会一直调用printSum的run,会一直打印sum,但这个sum和上面那个sum不是同一,所以一直是0不知道这么说LZ明白没有?
      

  2.   

    两个线程是几乎同时运行的,所以第1个线程还未对sum变量做加法但是第2个线程已经打印了。应该把第2个改成:
                else if(job.equals("print")){
                    try{
                        Thread.sleep(2000);
                    }catch(InterruptedException e){
                        System.out.println(e.getMessage());
                    }
                    finally
                    {
                        System.out.println("The sum is :"+sum);
                    }
                  }
      

  3.   

    而且你的sum变量应该加上static
      

  4.   

    LS这个同学也犯同样的错误
    addSum和printSum是两个不同的对象,addSum.sum和printSum.sum是两个不同的对象的属性,能有影响吗?最简单的方法是把sum改成static,否则成个程序都要改
      

  5.   

    ....楼主,你的程序代码首先从设计上就非常的不好,你的任务需求,是多线程模式中最为基础和常用的
    GuardedSuspension模式
    你的程序可以从另一种角度上说是,2个线程在操作不同的资源,所以当然,得不出你想要的结果
    合理的说
    程序设计需要3个类
    1.共享资源
    2.相加线程
    3.输出线程
    操作资源的方法由共享资源类提供,并且需要加锁,当相加结束后再输出。
      

  6.   

    哦,原来如此,我明白了。我只是想使用两个线程完成两个工作,忽略了这是创建两个对象,谢谢楼上的各位好心人。
    Edwin603同学,能不能在你说的在详细一些呀,我很想知道你这个应该怎么具体实现
      

  7.   

    看你的代码 我看应该是初学吧。
    我懒得写了.........,楼主看书去吧代码设计中需要除了我列举的3个类外,共享资源的方法中需要加锁,并且方法中会涉及到等待方法和唤醒方法!
    我所说的GuardedSuspension模式
    是指 等到准备好后再执行------等到相加好后,在输出。
    应用这个模式最简单的实现,就是我列举出来的3个类,我说的有一丁点抽象,想知道如何写,请好好看书吧!
    这个是最基础的设计了,每本线程书都会讲解的。
      

  8.   

    恩,楼主的代码是两个对象, 而且sum现在不是一个,而是两个。