2016-08-09 21 views
0

マルチスレッドプログラミングに関する基本情報がありますので、このトピックを改善し、デバッグモードを動作させるのには努力しましたが、正しく動作しません。マルチスレッドの動作時にデバッグが正しく動作しない理由

コード例:

public class MultiThreadsExample implements Runnable { 

private Thread t; 
private String threadName; 

//私はスレッド

public static void main(String[] args) { 
    MultiThreadsExample thread1=new MultiThreadsExample("Thread-1"); 
    thread1.start(); 
    MultiThreadsExample thread2=new MultiThreadsExample("Thread-2"); 
    thread2.start(); 

} 
//runnable interface override method 
@Override 
public void run() { 
    System.out.println("Running thread name:" + threadName); 
    for (int i = 0; i < 4; i++) { 
     System.out.println("Working thread: " + i + " " + threadName); 
     try { 
      Thread.sleep(50); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(MultiThreadsExample.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    System.out.println("Thread " + threadName + " interrupted."); 
} 

public void start() { 
    System.out.println("Starting " + threadName); 
    if (t == null) { 
     t = new Thread(this, threadName); 
     t.start(); 
    } 
} 

出力作成するコンストラクタメソッドがあります。私が思うあなたのコメントから

Creating thread name:Thread-1 Starting Thread-1 Creating thread name:Thread-2 Starting Thread-2 Running thread name:Thread-1 Working thread: 0 Thread-1 Working thread: 1 Thread-1 Working thread: 2 Thread-1 Working thread: 3 Thread-1 Thread Thread-1 interrupted. Running thread name:Thread-2 Working thread: 0 Thread-2 Working thread: 1 Thread-2 Working thread: 2 Thread-2 Working thread: 3 Thread-2 Thread Thread-2 interrupted.

+0

あなたは何を期待していましたか? – cHao

+0

デバッグモードで同期して動作しますが、シリアルで動作します。 – SerefAltindal

+2

シリアルで実行されるスレッドは、可能であり、依然として正しい結果です。スレッドを使用するときは、スレッドをいつ/どのように実行するかを制御することができます。そのコントロールを元に戻すには、 'java.util.concurrent'の内容を見てください。 (ちょうどインタリーブされたものを見たいのであれば、かなり長い時間眠るのに役立つかもしれませんが、私は通常このような例では1秒の遅延を使います) – cHao

答えて

1

を、あなたがしたいです出力は次のようになります。 Working thread: 0 Thread-1 Working thread: 0 Thread-2 Working thread: 1 Thread-1 Working thread: 1 Thread-2 ... これはスレッドの仕組みではありません。スレッドが正確に実行される順序は制御できません。 JVMまであり、あなたのマシンやOSのようなものに大きく依存していて、あなたのIDEでさえもデバッグしているからです。 運賃は私があなたのコードがうまく動作すると言うことができます。それは私のマシン上で動作しますので、私はあなたのコードを実行するときにところで

これが出力されます。 Creating thread name: Thread-1 Starting Thread-1 Creating thread name: Thread-2 Starting Thread-2 Running thread name:Thread-1 Running thread name:Thread-2 Working thread: 0 Thread-1 Working thread: 0 Thread-2 Working thread: 1 Thread-1 Working thread: 1 Thread-2 Working thread: 2 Thread-1 Working thread: 2 Thread-2 Working thread: 3 Thread-1 Working thread: 3 Thread-2 Thread Thread-1 interrupted. Thread Thread-2 interrupted.

あなたはthis oneのようにJavaでの同時実行上のいくつかのチュートリアルをチェックアウトする必要があります。 スレッド同期の基本について説明します。

関連する問題