2012-05-11 55 views
0

我遇到了Java问题。 我想编写一个程序,其中有一个Class的Main类,它有一些类(线程任务)的线程的ArrayList,它只是写一个字母和数字。 Object Main只是从ArrayList中唤醒一个线程,让它做一些事情,而同一个对象(Main)睡眠另一个线程。 但我得到非法状态的错误类任务:恢复和暂停ArrayList中的线程

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 

} 


} 

回答

0

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

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

换句话说,这被打破:

someObject.wait(); 
wait(); 

,虽然这是有效的:

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

但事实上,你永远不会调用notifynotifyAll是可疑的。

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

+0

谢谢,现在我纠正了它,但它看起来像那样 – Yoda

2

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

多次启动线程永远不合法。特别是,线程在完成执行后可能不会重新启动。

这就是你非法国家来自的地方。另外,你调用了Object.wait(),但从来没有调用notify(),这导致我相信你对你正在做的事情很少有想法。所以我建议你拿起一本书,阅读Java中的多线程和同步。这是一个很难的话题,但一旦你得到它,这将是非常有益的。