2
public class Thread1 extends Thread {
    public void run() {
         testFun1();
    }

     public void testFun1(){
          for(int i=1;i<10;i++){
              try {  
                  Thread.sleep(1000);
                      System.out.println("From testFun1() = "+i);
               } catch (Exception e) {
           }  

        }

      } 

    }

class Thread2 extends Thread {
    public void run(){
        testFun2();
    }

    public synchronized void testFun2() {
        try {
              for(int i=20;i<=25;i++){
               Thread.sleep(1000);  
               System.out.println("From testFun2() = "+i);           
        }
      }
    }

MainClass.java

public class MainClass{
    public static void main(String[] args) {
       try{ 
        Thread1 thread1 = new Thread1();
        Thread2 thread1 = new Thread2();
        thread1.start();
        Thread.sleep(3000);
        thread1.join();
        thread2.start();
     }catch(Exception e){
     }

   }
}

必要な出力:

From testFun1() 1
From testFun1() 2
From testFun1() 3
From testFun2() 20
From testFun2() 21
From testFun2() 22
From testFun2() 23
From testFun2() 24
From testFun2() 25
From testFun1() 4
From testFun1() 5
From testFun1() 6
From testFun1() 7
From testFun1() 8
From testFun1() 9
From testFun1() 10

しかし、上記のアウトプットは得られませんでした。

4

4 に答える 4

1

への呼び出しは、実行中の処理が完了するthread1.join()まで待機します。thread1したがって、2 つのスレッドが次々に実行されます。

于 2012-08-09T15:49:11.220 に答える
1

CountDownLatchクラスを確認してください。そのクラス javadoc には、調整スレッドの例があります。

于 2012-08-09T15:51:47.713 に答える
0

あなたの出力は、実際に持っているものが

thread1.start();

Thread.sleep(3000);

thread2.start();

thread1.join();

最後の 2 行が逆の場合、スレッド 1 は、スレッド 2 が開始する前に完了するまで実行されます。

于 2012-08-09T15:46:46.630 に答える
0

これが私が思いついたものです。提案/改善/悪い慣行についてコメントしてください。

public class App {

    public static void main(String[] args) {
        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();

        try {
            thread1.start();
            Thread.sleep(500);
            synchronized (thread1) {
                thread1.waiting = true;
                thread2.start();
                thread2.join();
                thread1.waiting = false;
                thread1.notify();
            }
        } catch (Exception e) {
            //TODO actually handle exception
        }
    }
}

クラス Thread1.java

public class Thread1 extends Thread {
    boolean waiting = false;

    public void run() {
        testFun1();
    }

    public void testFun1() {
        for (int i = 1; i < 10; i++) {
            synchronized (this) {
                while (waiting) {
                    try {
                        wait();
                    } catch (Exception e) {
                        //TODO Handle exception
                    }
                }
            }
            try {
                Thread.sleep(100);
                System.out.println("From testFun1() = " + i);
            } catch (Exception e) {
                //TODO Handle exception

            }
        }
    }
}

クラス Thread2.java

public class Thread2 extends Thread {

    public void run() {
        testFun2();
    }

    public void testFun2() {
        try {
            for (int i = 20; i <= 25; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    //catch
                }
                System.out.println("From testFun2() = " + i);
            }

        } catch (Exception e) {
            //TODO do something
        }

    }
}

出力:

C:\Java\jdk1.6.0_25\bin\java -Didea.launcher.port=7543 "-Didea.launcher.bin.path=C:\Program Files\JetBrains\IntelliJ IDEA 10.5.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Java\jdk1.6.0_25\jre\lib\alt-rt.jar;C:\Java\jdk1.6.0_25\jre\lib\alt-string.jar;C:\Java\jdk1.6.0_25\jre\lib\charsets.jar;C:\Java\jdk1.6.0_25\jre\lib\deploy.jar;C:\Java\jdk1.6.0_25\jre\lib\javaws.jar;C:\Java\jdk1.6.0_25\jre\lib\jce.jar;C:\Java\jdk1.6.0_25\jre\lib\jsse.jar;C:\Java\jdk1.6.0_25\jre\lib\management-agent.jar;C:\Java\jdk1.6.0_25\jre\lib\plugin.jar;C:\Java\jdk1.6.0_25\jre\lib\resources.jar;C:\Java\jdk1.6.0_25\jre\lib\rt.jar;C:\Java\jdk1.6.0_25\jre\lib\ext\dnsns.jar;C:\Java\jdk1.6.0_25\jre\lib\ext\localedata.jar;C:\Java\jdk1.6.0_25\jre\lib\ext\sunjce_provider.jar;C:\Java\jdk1.6.0_25\jre\lib\ext\sunmscapi.jar;C:\Java\jdk1.6.0_25\jre\lib\ext\sunpkcs11.jar;C:\IdeaProjects\PracticeModule\target\classes;C:\Program Files\JetBrains\IntelliJ IDEA 10.5.1\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain jmhp.core.App
From testFun1() = 1
From testFun1() = 2
From testFun1() = 3
From testFun1() = 4
From testFun1() = 5
From testFun2() = 20
From testFun2() = 21
From testFun2() = 22
From testFun2() = 23
From testFun2() = 24
From testFun2() = 25
From testFun1() = 6
From testFun1() = 7
From testFun1() = 8
From testFun1() = 9

よろしく!

于 2012-08-09T19:56:16.330 に答える