求帮助 我想让N条线程不用wait()的放数据 然后一条线程监控到有放数据就去取数据..
本帖最后由 Ahimsa0o 于 2012-12-02 23:23:36 编辑
            
其实我想让N条线程不用wait()的放数据 
然后一条线程监控到有放数据就去取数据的..
结果写成这样勒....
import java.util.ArrayList;
/**定义一个类  一个存数据一个取数据*/
public class MonitorAccess {
	private static ShareData data22 = new ShareData();
	protected static Object data;
	public static void main(String[] args){
		Thread.currentThread();
		for(int i=0;i<10;i++){
		new Thread(new Runnable(){
			public void run() {
				data22.putData(data);
			}
			
		}
				).start();
		new Thread(new Runnable(){
			public void run() {
				data22.getData(data);
			}
			
		}
				).start();
		}
	}
	/**两个线程一个放数据一个取数据 */
	class AddThread extends Thread{
		private ShareData d;
		public AddThread(ShareData p){
			this.d=p;
		}
		public void run(){
			data22.putData(data);	}
	}
	class GetThread extends Thread{
		private ShareData d;
		public GetThread(ShareData p){
			this.d=p;
		}
		public void run(){
			data22.getData(data);	}
	}
}
class ShareData {
	
	ArrayList datas = new ArrayList();
	private boolean isputall = false;//数据是否放完
	
	public synchronized void putData(Object a) {
		for(int i = 0;i<3;i++){
			datas.add(a);
			notify();
		}
		/**放数据*/
		isputall = true;
	}
	public synchronized void getData(Object a) {
		while(datas.size()==0){
			try{
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		/**取数据*/
		
		if(isputall = true){
			datas.clear();
		}
		isputall = false;
		}
	}
------最佳解决方案--------------------改了改代码,不知是否符合楼主要求,参考一下:
import java.util.ArrayList;
/**定义一个类  一个存数据一个取数据*/
public class MonitorAccess
{
	private static ShareData data22 = new ShareData();
	protected static Object data;
	public static void main(String[] args)
	{
		//Thread.currentThread();  //没用
		for(int i=0;i<10;i++)			//定义并启动10条存线程.
		{
			new Thread(new Runnable()
			{
				public void run() 
				{
					while(true)		//无限循环
					{
						try{Thread.sleep(1000);}catch(InterruptedException ie){};
						data22.putData(data);
					}
				}
			}).start();
		}
		new Thread(new Runnable()
		{
			public void run()
			{
				while(true)		//无限循环。
				{
					data22.getData(data);
				}
			}
		}).start();
	}
}
/*两个线程一个放数据一个取数据 //这两个都不需要.
class AddThread extends Thread{
private ShareData d;
public AddThread(ShareData p){
this.d=p;
}
public void run(){
data22.putData(data);	}
}
class GetThread extends Thread{
private ShareData d;
public GetThread(ShareData p){
this.d=p;
}
public void run(){
data22.getData(data);	}
}
}
*/
class ShareData
{
	static int j=0;