0

さて、これが私が持っているものです:私はProcessingでスレッドベースのプログラムを作成しようとしています。プログラムの動作はとてもシンプルで、それに対処することはできますが、スレッドで実行しようとすると、面白くなります。

簡単に言えば、私は次のようなものを作ってみました:

class supportClass{
   [All the junk.];
};
class threadClass extends Thread{
   boolean goingThread;
   [Some other junk.];
   threadClass(){
      goingThread = false;
      [Junk.]
   }
   void start(supportClass var){
      goingThread = true;
      run(var);
      goingThread = false;
   }
   void run(supportClass var){
      [Junk which does all the work!]
   }
};

そして、これがsetup()方法です:

void setup(){
   [Some junk init.];
   supportClass mySupportClass = new supportClass();
   threadClass myClass = new threadClass();
   myClass.start(mySupportClass);
}

したがって、ここに2つの問題があります。

1)フレーム自体も表示されません。つまり、プログラムはまったく実行されていないようです...;

2)のデータが変更されているため、使用している価値提供方法がわかりませんmySupportClass

StackOverflowで検索すると、スレッドでの値の解析について何も見つかりませんでした[処理中]。

ヒントはありますか?

4

2 に答える 2

3

@スーパークラスのrun()メソッドをオーバーライドして、スレッドコードを追加します。パラメータを使用して独自のstart()メソッドを作成したいが、run()を呼び出さない場合は、start()を呼び出します。

于 2013-02-20T15:52:21.333 に答える
1

まず、自分run(supportClass var)で呼び出さない限り、オーバーロードされたメソッドはThreadクラスによって無視されるため、スレッドは実行されません。実際、Threadクラスは、run実行する引数のないメソッドを期待しています。

次に、startメソッドについて。コードでは、独自のstartメソッドを提供しています。startThreadクラスのメソッドをオーバーライドしていません。結果として、スレッドが実行可能な状態になることはありません。startThreadクラスのメソッドは、現在のスレッドの状態をNew(作成されたばかりの)状態からtoRunnable状態(runメソッドを呼び出すことで実行できる状態)に変更します。スレッドが実行可能状態の場合、JVMスケジューラーによっていつでも実行対象として選択できます。

したがって、(コードを変更せずに)2つのことを行う必要があります。最初にstart(supportClass var)メソッドを呼び出しsuper.start()て、実行可能状態にします。またrun(var)、私が言ったように、スレッドを呼び出すのはプログラマーの仕事ではなく、JVMスケジューラーであるため、この行を削除します。そして、run引数なしでメソッドを定義します。

スレッドクラスに引数を渡したい場合は、戦略によって異なります。SupportClassのインスタンスごとに1つのスレッドが必要な場合(これが最も簡単です)、コンストラクターでそれらを渡すことができます。

スレッドに関する詳細情報を入手するには、これらのリンクを読むことをお勧めします。

  1. http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
  2. http://docs.oracle.com/javase/tutorial/essential/concurrency/
于 2013-02-20T17:04:45.903 に答える