以下是关于线程代码的内容和运行后提示如下异常:
Exception in thread "Thread-1" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.removeElementAt(Unknown Source)
at myThread.Thread1.run(Thread1.java:42)
at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Vector.ensureCapacityHelper(Unknown Source)
at java.util.Vector.addElement(Unknown Source)
at myThread.Thread1.run(Thread1.java:26)
at java.lang.Thread.run(Unknown Source)自己是在无法解决,情大侠们帮忙解决下;
package myThread;import java.util.*;public class Thread1 implements Runnable{
int thread;
int r2;
static int n1 = 0;
Vector v1 = new Vector();
Random r1 = new Random();
public Thread1(int a){
thread = a;
}

public String z(){
String s;
r2 = r1.nextInt(10);
Integer g = new Integer(r2);
s = g.toString();
return s;
}

public void run(){
if(thread == 1){
while(true){
v1.addElement(this.z());
try{
if(v1.size() == 10){
Thread.sleep(1000);
n1++;
}
}catch(Exception e){
e.printStackTrace();
}
if(n1 == 20){
break;
}
}
}else if(thread == 2){
while(true){
int k = v1.size();
v1.removeElementAt(k);
try{
if(v1.size() == 10){
Thread.sleep(1000);
n1++;
}
}catch(Exception e){
e.printStackTrace();
}
if(n1 == 20){
break;
}
}
}
System.out.println(v1);
}
}package myThread;public class RunThread { public static void main(String[] args) {
Thread1 c1 = new Thread1(1);
Thread1 c2 = new Thread1(2);
Thread s1 = new Thread(c1);
Thread s2 = new Thread(c2);
s1.start();
s2.start();
}
}

解决方案 »

  1.   

    Thread1 c2 = new Thread1(2); 当你传入2的时候
    Vector v1 = new Vector(); 里面没有一个元素
    v1.removeElementAt(k); 执行这句话的时候,报索引溢出。你调试一下。
      

  2.   

    package Thread;public class TwoThread {
    public static void main(String[] args) {
    Queue q=new Queue ();//new出一个q:后面的两个线程都是用的同一个q,保证一个put一个get
    Producer p=new Producer (q);//让new出的p去往q里面put
    Customer c=new Customer (q);//让new出的c从q中get
    p.start();//p和q开始的顺序并不报错
    c.start();

    }
    }
    class Producer extends Thread
    {
    Queue q;
    public Producer(Queue q) {
    this.q=q;//给成员变量赋值,再一调运q的put方法
    }
    @Override
    public void run() {
    for (int i = 0; i < 10; i++) {
    q.put(i);//此处只是让q去put  10次
    System.out.println("Producer put "+i);//并且输出本次放的是第几杯
    }
    }
    }
    class Customer extends Thread
    {
    Queue q;
    public Customer(Queue q) {
    this.q=q;//给成员变量赋值,再一调运q的get方法
    }
    @Override
    public void run() {
    while (true) {//死循环:只要q里面有,就去get
    //get方法有返回值,返回值就是producer所put的数量
    //此处也不需要去考虑是第几杯
    //在Queue中的value解决可这一问题:
    //put中的I赋给value,get方法有返回值就value的值
    System.out.println("Customer get "+q.get());
    //如果循环完了,就跳出循环,否则线程不会自己结束
    if (q.value==9) {
    break;
    }
    }

    }
    }
    class Queue
    {
    int value;
    boolean bFull=false;
    public synchronized void put (int i)//在producer中的put方法中就是将其I传进来
    {
    if (!bFull) {//条件为真(如果没满,就倒水)
    value=i;//给value赋值,现在有几杯水
    bFull=true;//满了
    notify();//唤醒其他线程(让customer去get)
    }
    try {
    wait();//告诉customer去get后自己等待customer的get结束
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public synchronized int get()
    {
    if (!bFull) {//如果没满就等待,如果满了就不进    **这就是为什么main里面谁先开始不报错的原因**
    //get和put方法中的if条件判断起到了至关重要的作用
    try {
    wait();
    } catch (InterruptedException e) {

    e.printStackTrace();
    }
    }
    bFull =false;//赋值为没满
    notify();//唤醒producer去put
    return value;//get的返回值就是put的时候给value赋的值
    }
    }
      

  3.   

    如果你不在处理 Vector里面数据的时候加同步块。。
    不用到 wait/notify 的话,肯定会要报错的。。