1

プログラムを実行しても「HIIII」が表示されません。私は初心者(一種)なので、「嫌い」にならないでください。私のwait()ステートメントは間違っていますか?または私は何が間違っているのですか?ArrayIndexOutOfBoundsのcatch句ですか?助けてください!

[edit]ああそうそれが主な方法ですか?それは何もしませんか? [edit]待機と通知が間違っていることはわかっています...言及しないでください。

//this is the whole class
import javax.swing.*;
import javax.swing.JOptionPane;
public class none {

static boolean game;
final static boolean on = true;
final static boolean off = false;
static boolean cheatMode;
public static void main(String[] args) {
    game = on;
    boolean tru = true;
    try{
        if(tru = Boolean.parseBoolean(args[0])){
            cheatMode = on;
            System.out.println("Cheats are on.");
        }
        }
        catch(java.lang.ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("Ignore this error, it's from not running it on the command prompt.");
        }
}



public class console extends Thread{
    public void run(){
        try{
        wait();
        JOptionPane.showMessageDialog(null,"HIIII");
        }
        catch(Exception e){
            e.printStackTrace();
            System.out.println("The console glitched...");
        }
//hiiii
        JOptionPane.showMessageDialog(null,"HIIII");
        }
    public class mainThingy extends Thread{
        public void run() {
        if(game = on)
        notify();
    }
}
    }
}
4

4 に答える 4

1

いくつかの問題があるようです

1) if(tru = Boolean.parseBoolean(args[0])){ 

上記のステートメントはassignemtであり、比較ではありません。==演算子を使用します。

2)待機して通知する場合は、常に同期ブロック内から呼び出す必要があります。あなたのコードはそれをしていないようです。

于 2012-10-11T06:45:06.717 に答える
0
  1. あなたのmain方法は実際には何も開始しません
  2. wait同じモニター/ロック上にあるnotify必要がありますsynchronized
  3. 2つのスレッドが同じモニター/ロックを共有していません
  4. if (game = on)inmainThingyは割り当てであり、チェックではありません。if (game == on)

例を使用した更新

public class TestThread {

    static boolean game;
    final static boolean on = true;
    final static boolean off = false;
    static boolean cheatMode;

    public static void main(String[] args) {
        game = on;
        boolean tru = true;
        try {
            if (args.length > 0) {
                if (tru = Boolean.parseBoolean(args[0])) {
                    cheatMode = on;
                    System.out.println("Cheats are on.");
                }
            }
        } catch (java.lang.ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
            System.out.println("Ignore this error, it's from not running it on the command prompt.");
        }

        Console con = new Console();
        con.start();

        // Give time for the console thread to get started
        do {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        } while (!con.isAlive());

        System.out.println("Start main...");
        Console.MainThingy main = new Console.MainThingy();
        main.start();

    }

    public static class Console extends Thread {

        // A shared lock that our two threads can communicate on...
        public static final Object WAIT_LOCK = new Object();

        public void run() {
            try {
                System.out.println("Waiting...");
                // Must "own" the monitor before we can call wait
                synchronized (WAIT_LOCK) {
                    WAIT_LOCK.wait();
                }
                JOptionPane.showMessageDialog(null, "HIIII");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("The console glitched...");
            }
        }

        public static class MainThingy extends Thread {

            public void run() {
                if (game == on) {
                    // Must "own" the monitor before we can call notify
                    synchronized (WAIT_LOCK) {
                        System.out.println("Notify...");
                        WAIT_LOCK.notify();
                    }
                }
            }
        }
    }
}

Javaの並行性は楽しいものですが、注意しないとうまく処理できないと噛み付きます。

Javaの通貨を読んでください

于 2012-10-11T06:45:05.633 に答える
0

I'd advise against the standard wait()-notify() structures. There are way better methods for this: the Java concurrency package.

And as you seem to be in your first steps in learning Java, I'd suggest another two books:

于 2012-10-11T07:36:34.333 に答える
0

>java none trueのみを印刷しますCheats are on。しかし、あなたの質問は印刷についてHiiiです。ではない ?クラスJOptionPane内のダイアログでそれを取得しました。consoleそれを初期化せずに、どのようにあなたのプログラムが印刷することを期待できますHiiiか?また、なぜ1つのファイルに2つのパブリッククラスを記述したのですか?waitメソッドを 呼び出すときは、ステートメントnottifyも欠落しています。synchronizedしたがって、スレッドを開始するconsoleと、とにかくmainThingyそれらがスローされます。IllegalMonitorStateExceptionそれで、実際にあなたは何をしようとしていますか?

于 2012-10-11T06:39:05.763 に答える