以下程序updateGUIFlag是标志updateTextGui线程的启动与停止,0表示停止,1表示运行。
同理,另一个也是。
我在线程updateTextGui运行的时候要停止histomgramMatchThread。
在线程histomgramMatchThread运行的时候,要停止updateTextGui线程
那么总有问题:   updateTextGui调用这个方法时,执行至suspend(),剩下的就不执行了。
 反之histomgramMatchThread调用这个方法时,执行至,剩下的也不执行了。
反正只能成一家之美。
怎么办》》》》》》》》   public void setAllThreadFlag(int updateGUIFlag, int histogramFlag){
      
      //设置更新界面前景点和对象数线程的挂起与运行
      if(updateGUIFlag == 0){
         System.out.println("更新界面被 挂起");
         if(updateGuiRunningFlag == true){
            updateTextGui.suspend();
            updateGuiRunningFlag = false;
         }
      }else{
         System.out.println("更新界面继续");
         if(updateGuiRunningFlag == false){
            updateTextGui.resume();
            updateGuiRunningFlag = true;
            System.out.println("线程被继续------------");
          }
      }
      
      //设置直方图匹配程序的挂起与运行
      if(histogramFlag == 0){
         System.out.println("直方图匹配程序被挂起");
         if(histogramRunningFlag == true){
            histomgramMatchThread.suspend();
            histogramRunningFlag = false;
         }
       }else{
          System.out.println("直方图匹配程序被继续");
          if(histogramRunningFlag == false){
             histomgramMatchThread.resume();
             histogramRunningFlag = true;
         }
       }
   }

解决方案 »

  1.   

    suspend()是干嘛的?
    或者你应该使用notify()来唤醒线程
      

  2.   

    同上,或者你把几个类简化 全部发出来 我贴到ELCIPSE里面帮你看下,一般线程都需要唤醒的 notify()
      

  3.   

    suspend()线程终止了,当然执行不了,而且这个方法也过时了,早就不用了,如果要退出程序可以用system.exit
      

  4.   

    两个线程没有共用对象,如果用wait和notify()来操作。
      

  5.   

    你怎么还在用 resume、suspend 这两个方法啊?上次都已经跟你说过了,不要再使用这两个方法。这两个方法早已在 JDK 1.2 中就已经被废弃,禁止使用。因为这些方法很容易造成死锁。具体的看看这两个方法的 API DOC,以及 java.sun.com 上的文章:http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
      

  6.   

    一下代码仅供参考: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赋的值
    }
    }