JAVA中級マルチスレッド

7781 ワード

マルチスレッドは同じ時間に複数のことをすることができます.マルチスレッドを作成するには、スレッドクラスを継承し、Runnableインタフェース、匿名クラスを実現する3つの方法があります.
スレッドの概念
まず、プロセス(Processor)とスレッド(Thread)の違いを理解します.LOL.exeを起動するとプロセスと呼ばれます.次に、2つのプロセスと呼ばれるDOTA.exeを起動します.スレッド:スレッドはプロセスの内部で同時に行うことであり、例えばLOLでは、「ゲレン」が「ティモ」を撃ち殺し、「賞金ハンター」が「盲僧」を撃ち殺しているなど、多くのことを同時にしなければならない.これはマルチスレッドによって実現される.
ここでコードはマルチスレッドを使用しない場合を示しています.ゲレンがティモを殺した後、賞金ハンターが盲僧を殺し始めただけです.
-------------------Hero.java-------------------
package charactor;
 
import java.io.Serializable;
  
public class Hero{
    public String name;
    public float hp;
     
    public int damage;
     
    public void attackHero(Hero h) {
        try {
            //          ,      1000  
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        h.hp-=damage;
        System.out.format("%s      %s, %s      %.0f%n",name,h.name,h.name,h.hp);
         
        if(h.isDead())
            System.out.println(h.name +"  !");
    }
 
    public boolean isDead() {
        return 0>=hp?true:false;
    }
 
}

---------------TestThread.java-----------------------------
package multiplethread;
 
import charactor.Hero;
 
public class TestThread {
 
    public static void main(String[] args) {
         
        Hero gareen = new Hero();
        gareen.name = "  ";
        gareen.hp = 616;
        gareen.damage = 50;
 
        Hero teemo = new Hero();
        teemo.name = "  ";
        teemo.hp = 300;
        teemo.damage = 30;
         
        Hero bh = new Hero();
        bh.name = "    ";
        bh.hp = 500;
        bh.damage = 65;
         
        Hero leesin = new Hero();
        leesin.name = "  ";
        leesin.hp = 455;
        leesin.damage = 80;
         
        //      
        while(!teemo.isDead()){
            gareen.attackHero(teemo);
        }
 
        //        
        while(!leesin.isDead()){
            bh.attackHero(leesin);
        }
    }
     
}

マルチスレッドの作成-スレッドクラスの継承
マルチスレッドを使用すると、ゲレンがティモを攻撃すると同時に、賞金ハンターも盲僧を攻撃してKillThreadを設計することができます. Threadを継承しrunメソッド起動スレッドメソッドを書き換える:KillThreadオブジェクトをインスタンス化し、startメソッドを呼び出すと賞金ハンターが盲僧を攻撃するのを観察できると同時に、ゲレンもティモを攻撃する
----------KillThread.java-----------------
package multiplethread;
 
import charactor.Hero;
 
public class KillThread extends Thread{
     
    private Hero h1;
    private Hero h2;
 
    public KillThread(Hero h1, Hero h2){
        this.h1 = h1;
        this.h2 = h2;
    }
 
    public void run(){
        while(!h2.isDead()){
            h1.attackHero(h2);
        }
    }
}
-----------TestThread.java--------------

package multiplethread;
 
import charactor.Hero;
 
public class TestThread {
 
    public static void main(String[] args) {
         
        Hero gareen = new Hero();
        gareen.name = "  ";
        gareen.hp = 616;
        gareen.damage = 50;
 
        Hero teemo = new Hero();
        teemo.name = "  ";
        teemo.hp = 300;
        teemo.damage = 30;
         
        Hero bh = new Hero();
        bh.name = "    ";
        bh.hp = 500;
        bh.damage = 65;
         
        Hero leesin = new Hero();
        leesin.name = "  ";
        leesin.hp = 455;
        leesin.damage = 80;
         
        KillThread killThread1 = new KillThread(gareen,teemo);
        killThread1.start();
        KillThread killThread2 = new KillThread(bh,leesin);
        killThread2.start();
         
    }
     
}

 
マルチスレッドの作成-Runnableインタフェースの実装
クラスBattleを作成し、Runnableインタフェースの起動を実現するには、まずBattleオブジェクトを作成し、その後、battleオブジェクトに基づいてスレッドオブジェクトを作成し、起動します.
Battle battle1 = new Battle(gareen,teemo);
new Thread(battle1).start();
battle 1オブジェクトはRunnableインタフェースを実装しているのでrunメソッドがありますが、runメソッドを直接呼び出すと、新しいスレッドは起動しません.スレッドオブジェクトのstart()を使用する必要があります.メソッドは、新しいスレッドを起動します.したがって、Threadオブジェクトを作成するときにbattle 1を構築メソッドのパラメータとして渡し、このスレッドが起動するとbattle 1.run()メソッドを実行します.
------------Battle.java------------
package multiplethread;
 
import charactor.Hero;
 
public class Battle implements Runnable{
     
    private Hero h1;
    private Hero h2;
 
    public Battle(Hero h1, Hero h2){
        this.h1 = h1;
        this.h2 = h2;
    }
 
    public void run(){
        while(!h2.isDead()){
            h1.attackHero(h2);
        }
    }
}
-----------TestThread.java------------------

package multiplethread;
 
import charactor.Hero;
 
public class TestThread {
 
    public static void main(String[] args) {
         
        Hero gareen = new Hero();
        gareen.name = "  ";
        gareen.hp = 616;
        gareen.damage = 50;
 
        Hero teemo = new Hero();
        teemo.name = "  ";
        teemo.hp = 300;
        teemo.damage = 30;
         
        Hero bh = new Hero();
        bh.name = "    ";
        bh.hp = 500;
        bh.damage = 65;
         
        Hero leesin = new Hero();
        leesin.name = "  ";
        leesin.hp = 455;
        leesin.damage = 80;
         
        Battle battle1 = new Battle(gareen,teemo);
         
        new Thread(battle1).start();
 
        Battle battle2 = new Battle(bh,leesin);
        new Thread(battle2).start();
 
    }
     
}

マルチスレッドの作成-匿名クラス
匿名クラスを使用して、Threadを継承し、runメソッドを書き換え、runメソッドに直接ビジネスコード匿名クラスを書くメリットの1つは、外部のローカル変数に容易にアクセスできることです.外部のローカル変数はfinalと宣言する必要があることを前提としています.(JDK 7以降は不要です)
package multiplethread;
  
import charactor.Hero;
  
public class TestThread {
  
    public static void main(String[] args) {
          
        Hero gareen = new Hero();
        gareen.name = "  ";
        gareen.hp = 616;
        gareen.damage = 50;
  
        Hero teemo = new Hero();
        teemo.name = "  ";
        teemo.hp = 300;
        teemo.damage = 30;
          
        Hero bh = new Hero();
        bh.name = "    ";
        bh.hp = 500;
        bh.damage = 65;
          
        Hero leesin = new Hero();
        leesin.name = "  ";
        leesin.hp = 455;
        leesin.damage = 80;
          
        //   
        Thread t1= new Thread(){
            public void run(){
                //             teemo,   teemo   final
                //   JDK7  ,      final  
                while(!teemo.isDead()){
                    gareen.attackHero(teemo);
                }              
            }
        };
         
        t1.start();
          
        Thread t2= new Thread(){
            public void run(){
                while(!leesin.isDead()){
                    bh.attackHero(leesin);
                }              
            }
        };
        t2.start();
         
    }
      
}

マルチスレッドを作成する3つの方法
上記の3つの方法を整理してみます.1.Threadクラスを継承する2.Runnableインタフェースを実現する3.匿名クラスの方法注:起動スレッドはstart()メソッドであり、run()は新しいスレッドを起動することはできません
現在のスレッドを一時停止
Thread.sleep(1000);現在のスレッドが1000ミリ秒停止し、他のスレッドが影響を受けないことを示すThread.sleep(1000);InterruptedException割り込み異常が投げ出される.現在のスレッドsleepの場合、停止される可能性があるため、InterruptedExceptionが投げ出される
package multiplethread;
 
public class TestThread {
 
    public static void main(String[] args) {
         
        Thread t1= new Thread(){
            public void run(){
                int seconds =0;
                while(true){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.printf("    LOL %d  %n", seconds++);
                }              
            }
        };
        t1.start();
         
    }
     
}