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

如何把多个线程放到一个队列里?
需要产生很多线程。每个线程都执行一样的任务,比如调用某种资源。

不过不是每个线程都能顺利执行至结束的,所以没有成功的线程我想把它放到一个队列Queue里(比如用linkedlist来实现),然后按照固定的时间,比如每5秒钟后,从队列里拿出最前面的那个线程再去执行当时失败的任务。

具体如何做才能实现这个过程那?

开始想到需要把失败的线程暂停,然后把线程对象放到队列里,等队列中前面的都执行完了,再重新激活这个线程再去尝试执行原来的任务。可是发现线程的suspend等都不能用。

那我可以在线程的RUN部分的代码里,如果发现执行失败,就在退出线程代码前加上 queue.addLast(this)么?这样能把这个线程对象加到队列里来么,等到再取出来时,会执行一样的功能?

或者有更好的解决方案?谢谢!

------解决方案--------------------
Use the Event queue to retrieve event 
Java code
import java.awt.AWTEvent;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class EventQueuePanel extends JPanel implements ActionListener {
  EventQueuePanel() {
    JButton button = new JButton("Draw line");
    add(button);
    button.addActionListener(this);
  }

  public void actionPerformed(ActionEvent evt) {
    Graphics g = getGraphics();

    displayPrompt(g, "Click to chooose the first point");
    Point p = getClick();
    g.drawOval(p.x - 2, p.y - 2, 4, 4);
    displayPrompt(g, "Click to choose the second point");
    Point q = getClick();
    g.drawOval(q.x - 2, q.y - 2, 4, 4);
    g.drawLine(p.x, p.y, q.x, q.y);
    displayPrompt(g, "Done! Press button the start again.");
    g.dispose();
  }

  public void displayPrompt(Graphics g, String s) {
    y += 20;
    g.drawString(s, 0, y);
  }

  public Point getClick() {
    EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();
    while (true) {
      try {
        AWTEvent evt = eq.getNextEvent();
        if (evt.getID() == MouseEvent.MOUSE_PRESSED) {
          MouseEvent mevt = (MouseEvent) evt;
          Point p = mevt.getPoint();
          Point top = getRootPane().getLocation();
          p.x -= top.x;
          p.y -= top.y;
          return p;
        }
      } catch (InterruptedException e) {
      }
    }
  }

  private int y = 60;
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setTitle("EventQueueTest");
    frame.setSize(300, 200);
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });

    Container contentPane = frame.getContentPane();
    contentPane.add(new EventQueuePanel());

    frame.show();
  }

}

------解决方案--------------------
Queue data structure 
Java code
public class Queue { 
private int maxSize;

private long[] queArray;

private int front;

private int rear;

private int nItems;

public Queue(int s) {
  maxSize = s;
  queArray = new long[maxSize];
  front = 0;
  rear = -1;
  nItems = 0;
}

//  put item at end of a queue
public void insert(long j) {
  if (rear == maxSize - 1) // deal with wraparound
  rear = -1;
  queArray[++rear] = j; // increment rear and insert
  nItems++;
}

//  take item from front of queue
public long remove() {
  long temp = queArray[front++]; // get value and incr front
  if (front == maxSize) // deal with wraparound
  front = 0;
  nItems--; // one less item
  return temp;
}

public long peekFront() {
  return queArray[front];
}

public boolean isEmpty() {
  return (nItems == 0);
}