从ArrayList恢复和挂起线程

时间:2012-05-11 23:43:41

标签: java multithreading sleep wakeup

我遇到了Java问题。 我想编写一个程序,其中有Class Main,它有一些类的ThreadList(Class Task),它只写一个字母和数字。 Object Main只是从ArrayList中唤醒一个Thread,让它在同一个对象(Main)睡眠另一个时执行某些操作。 但我在课程任务中得到了非法状态的错误:

while(suspended){
wait();
    System.out.println(character);
        }

整个代码

import java.util.ArrayList;


public class Main extends Thread {
ArrayList<Thread> threads;
public Main() {
    super();
    threads = new ArrayList<Thread>();
}

public void run(){
    for(int i = 0; i < 1; i++){
        threads.add(new Thread(new Task(i+65)));
    }
    long cT = System.currentTimeMillis();
    for(int i = 0; i < threads.size(); i++){
        threads.get(i).start();
    }
    while(System.currentTimeMillis() - cT < 10000){
        for(int i = 0; i < threads.size(); i++){
            threads.get(i).start();
            try {
                Thread.sleep(1000);
            } catch (Exception e) {e.printStackTrace();
            }
            threads.get(i).stop();;
        }
    } 


}




public static void main(String[] args) {
//  new Main().start();
    new Thread(new Task(65)).start();

}

}


public class Task implements Runnable {
int nr;
char character;
boolean suspended, resumed, stopped;
public Task(int literaASCII) {
    this.nr = 0;
    character = (char) (literaASCII);
    suspended = true;
    resumed = true;
    stopped = false;
}

@Override
public void run() {
    while(true){
        try{
        while(suspended){
            wait();
            System.out.println(character);
        }
        if(resumed){
            System.out.println("(Wznawiam watek litera: "+character+")");
            resumed = false;
        } 
        System.out.print(nr+""+character+", ");
        nr++;
        int r =  (int)((Math.random()*500) + 500);
        Thread.sleep(r);
        }catch(Exception e){e.printStackTrace();} 
    }
}

synchronized    public void suspend(){
    suspended = true;
    resumed = false; //chyba zbedne
}

synchronized    public void resume(){
    suspended  = false;
    resumed = true;
}


public static void main(String[] args) {
    // TODO Auto-generated method stub

}


}

2 个答案:

答案 0 :(得分:2)

如果你阅读了Thread.start()的Javadoc,你会发现它说:

  

不止一次启动线程永远不合法。特别是,a   一旦完成执行,线程可能无法重新启动。

这就是你非法国家的来源。

另外,你调用了Object.wait()但从未调用过notify(),这让我相信你对你正在做的事情一无所知。所以我建议你拿起一本书,阅读Java中的多线程和同步。这是一个很难的主题,但一旦你得到它,它将是非常有益的。

答案 1 :(得分:0)

someObject.wait()只能由someObject上同步的线程调用。 wait的JavaDoc提到了这一点:

  

当前线程必须拥有此对象的监视器。   (source

换句话说,这是破碎的:

someObject.wait();
wait();

虽然这是有效的:

synchronized(someObject) {
    someObject.wait();
}
synchronized(this) {
    wait();
}

但是,您从未致电notifynotifyAll的事实是可疑的。

听起来你正在尝试实现的是一个阻塞队列:一个线程将项目放到该线程上,另一个线程将它们从它中取出并处理它们。如果是这种情况,您应该查看BlockingQueue