日期:2014-05-20  浏览次数:20837 次

求帮助 我想让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;