package net.studyinghttp; public class ThreadTester2 { // メイン関数 public static void main(String[] args) { // インスタンスを生成 MyThread1b th1 = new MyThread1b(); MyThread2b th2 = new MyThread2b(); // スレッドを開始 th1.startThread(); th2.startThread(); } // グローバルカウンタ private static int gCounter = 0; /** * 数字と文字を出力する * @param thName スレッド名 */ synchronized // このメソッドにロックをかける static void printOut (String thName, int lCnt) { ++gCounter; for (int i=0;i<5000;i++) { if (i%100 ==0) { System.out.print ("-"); } } System.out.println("#"); System.out.print ("ThreadName: "+ thName); System.out.print (" ("+ lCnt +"times)"); System.out.println(", Total :"+ gCounter +" times"); } } // Threadクラスを継承してスレッドを実現するクラス class MyThread1b extends Thread { // カウンタ int lCnt = 0; /** * スレッド内の処理を記述 * @param なし */ public void run() { for(lCnt=1; lCnt<=10; lCnt++) { // プリントアウト ThreadTester2.printOut("MyThread1", lCnt); // プリエンプト yield(); } } /** * スレッドを開始するためのメソッド * @param なし */ public void startThread() { this.start(); } } // Runnableインタフェースを実装してスレッドを実現するクラス class MyThread2b implements Runnable { // カウンタ int lCnt = 0; // 継承しない場合はインスタンスを作っておく Thread thread = new Thread(this); /** * スレッド内の処理を記述 * @param なし */ public void run() { for(lCnt=1; lCnt<=10; lCnt++) { // プリントアウト ThreadTester2.printOut("MyThread2", lCnt); // プリエンプト Thread.yield(); } } /** * スレッドを開始するためのメソッド * @param なし */ public void startThread() { thread.start(); } }