マルチスレッド学習ノート2

11628 ワード

スレッドのスケジューリングと優先度の問題
  • A:スレッドのスケジューリングa:タイムシェアリングスケジューリングb:プリエンプトスケジューリング(Javaはこのスケジューリング方式を採用)
  • B:スレッド優先度の取得と設定a:デフォルトは5 b:範囲は1-10
  • public class ThreadPriority extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x);
            }
        }
    public static void main(String[] args) {
            ThreadPriority tp1 = new ThreadPriority();
            ThreadPriority tp2 = new ThreadPriority();
            ThreadPriority tp3 = new ThreadPriority();
    
            tp1.setName("    ");
            tp2.setName("   ");
            tp3.setName("   ");
    
            //        
            // System.out.println(tp1.getPriority());
            // System.out.println(tp2.getPriority());
            // System.out.println(tp3.getPriority());
    
            //        
            // tp1.setPriority(100000);
    
            //          
            tp1.setPriority(10);
            tp2.setPriority(1);
    
            tp1.start();
            tp2.start();
            tp3.start();
        }
    
    
        }
    

    スレッドの制御(一般的な方法)
  • A:スリープスレッド
  • public class ThreadSleep extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x + ",  :" + new Date());
                //   
                //   ,     1  
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    /*
     *     
     *      public static void sleep(long millis)
     */
    public class ThreadSleepDemo {
        public static void main(String[] args) {
            ThreadSleep ts1 = new ThreadSleep();
            ThreadSleep ts2 = new ThreadSleep();
            ThreadSleep ts3 = new ThreadSleep();
    
            ts1.setName("   ");
            ts2.setName("   ");
            ts3.setName("   ");
    
            ts1.start();
            ts2.start();
            ts3.start();
        }
    }
  • B:スレッドの現在のスレッドを追加して一時停止し、指定したスレッドの実行が終了するのを待ってから、現在のスレッドは
  • に続きます.
    public class ThreadJoin extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x);
            }
        }
    }
    
    public class ThreadJoinDemo {
        public static void main(String[] args) {
            ThreadJoin tj1 = new ThreadJoin();
            ThreadJoin tj2 = new ThreadJoin();
            ThreadJoin tj3 = new ThreadJoin();
    
            tj1.setName("  ");
            tj2.setName("   ");
            tj3.setName("   ");
    
            tj1.start();
            try {
                tj1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            tj2.start();
            tj3.start();
        }
    }
  • C:礼譲スレッドyield譲渡cpu
  • public class ThreadYield extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x);
                Thread.yield();
            }
        }
    }
    public class ThreadYieldDemo {
        public static void main(String[] args) {
            ThreadYield ty1 = new ThreadYield();
            ThreadYield ty2 = new ThreadYield();
    
            ty1.setName("   ");
            ty2.setName("  ");
    
            ty1.start();
            ty2.start();
        }
    }
    
  • D:バックグラウンドスレッドは、単独で実行することなく、他の非デーモンスレッドの実行が終了すると、
  • を自動的に終了するデーモンスレッドとして設定.
    public class ThreadDaemon extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(getName() + ":" + x);
            }
        }
    }
    public class ThreadDaemonDemo {
        public static void main(String[] args) {
            ThreadDaemon td1 = new ThreadDaemon();
            ThreadDaemon td2 = new ThreadDaemon();
    
            td1.setName("  ");
            td2.setName("  ");
    
            //       
            td1.setDaemon(true);
            td2.setDaemon(true);
    
            td1.start();
            td2.start();
    
            Thread.currentThread().setName("  ");
            for (int x = 0; x < 5; x++) {
                System.out.println(Thread.currentThread().getName() + ":" + x);
            }
        }
    }
    
  • E:終端スレッド(把握)
  • 
    public class ThreadStop extends Thread {
        @Override
        public void run() {
            System.out.println("    :" + new Date());
    
            //     10  , ,      
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // e.printStackTrace();
                System.out.println("      ");
            }
    
            System.out.println("    :" + new Date());
        }
    }
    
    public class ThreadStopDemo {
        public static void main(String[] args) {
            ThreadStop ts = new ThreadStop();
            ts.start();
    
            //          ,     
            try {
                Thread.sleep(3000);
                // ts.stop();
                ts.interrupt();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }