【マルチスレッド】スレッド常用操作方法メモ

7036 ワード

【マルチスレッド】スレッド常用操作方法メモ
この章の目的:
スレッド名の設定と取得について
スレッドの強制実行について
スレッドのスリープについて
スレッドの礼譲を理解する
スレッドの割り込み操作の理解
3.1スレッドの名前の取得と設定
Threadクラスでは、getName()メソッドでスレッドの名前を取得し、setName()メソッドでスレッドの名前を設定できます.
スレッドの名前は、通常、スレッドが起動する前に設定されますが、実行されるスレッドの名前を設定することもできます.2つのThreadオブジェクトに同じ名前を付けることを許可しますが、明確にするためには、このような状況を避ける必要があります.
また、プログラムにスレッドの名前が指定されていない場合は、自動的にスレッドに名前が割り当てられます.
例1:
class MyThread implement Runnable{
    public void run(){
        for(int i=0;i<3;i++){
            System.out.println(Thread.currentThread().getName()+" ,i = "+i);    //         
        }        
    }
}
public class ThreadNameDemo{
    public static void main(String[] args){
        MyThread mt1 = new MyThread();    // Runnable 
        new Thread(mt1).start();
        new Thread(mt1," -A").start();
        new Thread(mt1," -B").start();
        new THread(mt1).start();
    }
}

3.2現在のスレッドの取得
class MyThread implement Runnable{
    public void run(){
        for(int i=0;i<3;i++){
            System.out.println(Thread.currentThread().getName()+" ,i = "+i);    //         
        }        
    }
}
public class ThreadNameDemo{
    public static void main(String[] args){
        MyThread mt1 = new MyThread();    // Runnable 
        new Thread(mt1," -A").start();
        mt1.run();
    }
}

出力:
スレッド実行、i=0
スレッド実行、i=1
スレッド実行、i=2
main実行、i=0
main実行,i=1
main運転、i=2
mt1.run();この文の呼び出しは、プライマリ・メソッドによって行われます.つまり、プライマリ・メソッド自体もスレッドです.プライマリ・スレッドです.
質問:メインメソッドがスレッド形式で現れる以上、JAVA実行時にいったい何個のスレッドが起動したのでしょうか.
回答:少なくとも2つ(メインスレッド、GC)
3.3、スレッドが起動したかどうかを判断する
class MyThread implements Runnable{
    public void run(){
        for(int i=0;i<3;i++){
            System.out.println(Thread.currentThread().getName()+" ,i="+i);
        }
    }
}
public class ThreadAliveDemo{
    public static void main(String[] args){
        MyThread mt = new MyThread();    // Runnable 
        Thread t = new Thread(mt," ");    // Thread 
        System.out.println("   -->"+t.isAlive());
        t.start();    // 
        System.out.println("   -->"+t.isAlive());
        for(int i=0;i<3;i++){
            System.out.println("main -->"+i);
        }
        // 
        System.out.println(" -->" + t.isAlive());
    }
}

3.4、スレッドの強制運転
スレッド操作では、join()メソッドを使用して1つのスレッドを強制的に実行できます.スレッド強制実行中、他のスレッドは実行できません.このスレッドが完了してから実行を続行する必要があります.
mainスレッドとThreadスレッドの強制実行例:
class MyThread implements Runnable{
    public void run(){
        for(int i=0;i<3;i++){
            System.out.println(Thread.currentThread().getName()+" ,i="+i);
        }
    }
}
public class ThreadJoinDemo{
    public static void main(String[] args){
        MyThread mt = new MyThread();
        Thread t = new Thread(mt," ");
        t.start();    // 
        for(int i=0;i<50;i++){
            if(i>10){
                try{
                    t.join();    // 
                }catch(InterruptedException e){
                    e.printStackTrace();                
                }
            }
            System.out.println("Main -->"+i);    
        }
    }
}

3.5、スレッドのスリープ
スリープを使用すると、スレッドの実行を一時停止できます.
使用するsleep()メソッドでOK!
class MyThread implements Runnable{
    public void run(){
        for(int i=0;i<50;i++){
            try{
                Thread.sleep(500);
            }catch(InterruptedException e){
                System.out.println(Thread.currentThread().getName());
            }
        }
    }
}
public class ThreadSleepDemo{
    public static void main(String[] args){
        MyThread mt = new MyThread();    // Runnable 
        Thread t = new Thread(mt);
        t.start();    // 
    }
}

3.6スレッドの割り込み
1つのスレッドが別のスレッドによって動作を中断された状態でinterrupt()を使用して動作を完了
class MyThread implements Runnable{
    public void run(){
        System.out.print("1、 run() ");
        try{
            Thread.sleep(10000);    // 10 
            System.out.println("2、 ");
        }catch(InterruptedException e){
            System.out.println("3、 ");
            return ;    // 
        }
        System.out.println("4、run() ");
    }
}
public class ThreadInterruptedDemo{
    public static void main(String[] args){
        MyThread mt = new MyThread();
        Thread t = new Thread(mt," ");
        t.start();
        try{
            Thread.sleep(2000);    // 2 
        }catch(InterruptedException e){
            System.out.println("3、 ");
        }
        t.interrupt();    // 
    }
}

3.7、バックグラウンドスレッド
Javaでは、1つのプログラムが実行されていない限り(スレッドが実行されている)、java全体のプロセスは消えないので、javaプロセスが終了してもバックグラウンドスレッドを設定できます.
このような操作を実現するにはsetDaemo()メソッドを直接使用すればよい.
class MyThread implements Runnable{
    public void run(){
        while(true){
            System.out.println(Thread.currentThread().getName()+" 。");
        }
    }
}
public class ThreadDaemonDemo{
    public static void main(String[] args){
        MyThread mt = new MyThread();
        Thread t = new Thread(mt," ");
        t.setDaemon(true);    // 
        t.start();    // 
    }
}

3.8、スレッドの優先度
最優先順位MAX_PRIORITY
中優先度NORM_PRIORITY
最小優先度MIN_PRIORITY
class MyThread implements Runnable{
    public void run(){
        for(int i=0;i<5;i++){
            try{
                Thread.sleep(500);
            }catch(InterruptedException e){
            }
            System.out.println(Thread.currentThread().getName()+" ,i="+i);
        }
    }
}
public class ThreadPriorityDemo{
    public static void main(String[] args){
        Thread t1 = new Thread(new MyThread()," A");
        Thread t2 = new Thread(new MyThread()," B");
        Thread t3 = new Thread(new MyThread()," C");
        t1.setPriority(Thread.MAX_PRIORITY);
        t2.setPriority(Thread.NORM_PRIORITY);
        t3.setPriority(Thread.MIN_PRIORITY);
    }
}

メインスレッドmain()の優先度はNORM_PRIORITY
3.9、スレッドの礼譲
スレッドの操作では、yield()メソッドを使用して、1つのスレッドの操作を他のスレッドの操作に一時的に譲ることができます.
class MyThread implements Runnable{
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println(Thread.currentThread().getName()+" ,i");
            if(i==3){
                System.out.println(" :");
                Thread.currentThread().yield();        // 
            }        
        }    
    }
}
public class ThreadYieldDemo{
    public static void main(String args[]){
        MyThread my = new MyThread();
        Thread t1 = new Thread(my," A");
        Thread t2 = new Thread(my," B");
        t1.start();
        t2.start();
    }
}