0

次の文字を含むリストを生成するアプリケーションを作成する必要があります: H、A、O、*、#、@。最後の 2 つは制御文字です。「#」はリストを (ツリーのように) 2 つに分割し、各サブリストはリストが終了したことを示す「@」が表示されるまで入力を続ける必要があります。このプロセスは、すべてのサブリストが「@」を持つか、すべてのサブリストを合わせた長さが 10000 になるまで続きます。

次に、スレッドを使用してリストを反復処理し、文字ごとに異なる画像をフレームにペイントする必要があります。「#」が見つかった場合、スレッドは他の 2 つのスレッドを開始して、次の 2 つのサブリストを反復処理し、終了する必要があります。

新しいスレッドを開始して最初のスレッドを終了する必要があるときに、その部分で行き詰まります。グーグルでこれを行う方法を見つけましたが、それは悪い方法だと思います。だから私の質問は:これを作る別の方法はありますか?

public class PainterThread implements Runnable {


public PainterThread(Iterator pIterator, ExecutorService pPool, PaintingPanel pPanel) {
    _iteratorList = pIterator;  //the Iterator of the list
    _Pool = pPool;          //I pass the ThreadPool as a parameter in order to make the request to create new threads
    _PanelToPaint = pPanel;// The Panel which going to paint the images
}

//Methods
@Override
public void run() {
    while (_iteratorList.hasNext()) {
        Node actualNode = (Node) _iteratorList.next();
        switch (actualNode.getControlSign()) {
            case "H":
                _PanelToPaint.addShapes(new Square(actualNode.getPositionX(), actualNode.getPositionY(), actualNode.getSize()));
                _PanelToPaint.repaint();
                break;
            case "A":
                _PanelToPaint.addShapes(new Triangle(actualNode.getPositionX(), actualNode.getPositionY(), actualNode.getSize()));
                _PanelToPaint.repaint();
                break;
            case "O":
                _PanelToPaint.addShapes(new Circle(actualNode.getPositionX(), actualNode.getPositionY(), actualNode.getSize()));
                _PanelToPaint.repaint();
                break;
            case "*":
                _PanelToPaint.addShapes(new Asterisk(actualNode.getPositionX(), actualNode.getPositionY(), actualNode.getSize()));
                _PanelToPaint.repaint();
                break;
            case "#":
                LinkedList actualList = (LinkedList) _iteratorList.next();
                _Pool.submit(new PainterThread(actualList.iterator(), _Pool,_PanelToPaint)); //Here is my question. Is there another way to make this?
                if (_iteratorList.hasNext()) {
                    actualList = (LinkedList) _iteratorList.next();
                    _Pool.submit(new PainterThread(actualList.iterator(), _Pool, _PanelToPaint));
                }
                break;
            case "@":
                break;
        }
    }
}

public void setIterator(Iterator pNewIterator) {
    _iteratorList = pNewIterator;
}
//Atributes
private Iterator _iteratorList;
private ExecutorService _Pool;
private PaintingPanel _PanelToPaint;

}

4

0 に答える 0