一个麻烦的实时性问题

07-04-17 zhwh19790
A生成多个线程,之后线程取A中的某个变量c,但是c又是在构造函数里面赋值的(实时性),我的做法是使用static方法取c(因为new A实在不方便),所以我把c定义成了static变量,请问这么写好不好?有什么问题?有没有别的好办法?

举例:

class A{
   private static String c;

   public A(String c1){
           this.c =c1;
                }

   public static String getparam(){
           return c;
             }
}
<p>

...........线程里面getparam()

Coolyu0916
2007-04-17 16:40
不明白想做什么,能说得清楚一些么??

zhwh19790
2007-04-17 17:00
A生成多个线程,然后线程取A中的变量c,但是c又是在构造函数里面赋值的,怎么做?如果是C++的话,我可以delete这个A,但是java里面是自动回收的,我都搞不清楚是哪个实例调用方法。

zhwh19790
2007-04-17 17:02
A生成多个线程,c是在构造函数里面赋值,然后线程取A中的变量c。

Coolyu0916
2007-04-17 17:05
我真的不明白你说得

比如class A,会生成多个现成B,现在B要访问A中的数据C是这个意思么??,而C是A构造方法赋值的??

zhwh19790
2007-04-17 17:08
是B要访问A中的数据C,c是通过A的构造函数赋的值。

zhwh19790
2007-04-18 08:43
是我讲得不清楚吗?怎么没回复?

zhwh19790
2007-04-18 09:09

class B{
   
   A a = new A(c1);
}

class A{
   private String c;

   public A(String c1){
     this.c = c1;}

   public void createThread(){
        new D().start();}

   public void notifyThread(){
     notifyAll();//唤醒线程  
     }
 

}

class D extends Thread{

     public void run(){

           while(true){
              wait();
              if(...)//判断条件里含方法,取A中的变量c;如果满足则继续
         
                {    }else{continue;}//否则返回while去wait();

                                  
   }
 }
}

我的意思就是线程D中的方法如何写?

Coolyu0916
2007-04-18 09:11
可是多线程的是那个

进程解决的是资源的分配

现成解决的是功能

线程访问进程数据是没有任何问题的

直接访问就可以了

C是A构造的时候赋值的也就是必定存在一个A.c 构造函数之后你才可以spawn一个线程出来,从时序而言会有什么问题那??多线程访问最好进行原子访问,否则必须加锁。你可以画一下时序图,看一看B出现的时候A是否已经存在。

Coolyu0916
2007-04-18 09:29
class B{      
	A a = new A(c1);
}

class A{
	private String c;
	public A(String c1){
		this.c = c1;
	}

	public void createThread(){
		new D(this).start();
	}
	
	public void notifyThread(){
		notifyAll();//唤醒线程       
	}

	public synchronized void setC(string value){
		c = value;
	}

	public synchronized string getC()
	{
		return c;
	}
}
	
class D extends Thread{
	private A _a;
	public D(A a){
		_a = a;
	}

	public void run(){
		while(true){
			wait();
			if(...)//判断条件里含方法,取A中的变量c;如果满足则继续
				{    }
			else{continue;}//否则返回while去wait();
		}
		//访问A的数据
		_a.setC(string c);
	}
}

<p>

[该贴被Coolyu0916于2007年04月18日 09:43修改过]

Coolyu0916
2007-04-18 09:29
不知道是不是满足你的需求

[该贴被Coolyu0916于2007年04月18日 09:43修改过]

zhwh19790
2007-04-18 09:47
我把B里面写得更清楚点吧,B是实时生成的,但是根据条件执行A里的方法。

class B{      
   A a = new A(c1);

   if(...){
        a.createThread();
   }else if(...){
        a.notifyThread();}

}

class A{   
    private String c;  
 
    public A(String c1){     
              this.c = c1;}   

    public void createThread(){        
              new D().start();}   

    public void notifyThread(){     
              notifyAll();//唤醒线程       } 
}

    class D extends Thread{    
 
          public void run(){           
                while(true){              
                   wait();              
                   if(...)//判断条件里含方法,取A中的变量c,满足则继续
                {    }else{continue;} //否则返回while去wait();      

                     } }}
<p>

线程D中if条件里有个方法要取A中的变量c,不知道该怎么写?

zhwh19790
2007-04-18 09:56
to Coolyu0916

:谢谢你耐心的回复,我的意思是 线程是A生成,但生成后就一直存在,而且是一次就生成所有线程,以后就不再生成线程了。而A是动态生成是经常变化的(A的实例会被清除),所以A的变量c也是变化的。以不变的线程取变化的A中的变化的c,这就是我烦恼的地方。

[该贴被zhwh19790于2007年04月18日 10:03修改过]

Coolyu0916
2007-04-18 10:00
D中引用了A,所以A不会被gc收集的。如果想A是唯一的可以使用Singleton模式。

zhwh19790
2007-04-18 10:07
A不是唯一的,因为A是B动态生成的。

猜你喜欢
2Go 1 2 下一页