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:让线程做不同的工作都有什么样的手段可以实现
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();
}
}
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明白没有?
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);
}
}
addSum和printSum是两个不同的对象,addSum.sum和printSum.sum是两个不同的对象的属性,能有影响吗?最简单的方法是把sum改成static,否则成个程序都要改
GuardedSuspension模式
你的程序可以从另一种角度上说是,2个线程在操作不同的资源,所以当然,得不出你想要的结果
合理的说
程序设计需要3个类
1.共享资源
2.相加线程
3.输出线程
操作资源的方法由共享资源类提供,并且需要加锁,当相加结束后再输出。
Edwin603同学,能不能在你说的在详细一些呀,我很想知道你这个应该怎么具体实现
我懒得写了.........,楼主看书去吧代码设计中需要除了我列举的3个类外,共享资源的方法中需要加锁,并且方法中会涉及到等待方法和唤醒方法!
我所说的GuardedSuspension模式
是指 等到准备好后再执行------等到相加好后,在输出。
应用这个模式最简单的实现,就是我列举出来的3个类,我说的有一丁点抽象,想知道如何写,请好好看书吧!
这个是最基础的设计了,每本线程书都会讲解的。