JAVA中級マルチスレッド
7781 ワード
マルチスレッドは同じ時間に複数のことをすることができます.マルチスレッドを作成するには、スレッドクラスを継承し、Runnableインタフェース、匿名クラスを実現する3つの方法があります.
スレッドの概念
まず、プロセス(Processor)とスレッド(Thread)の違いを理解します.LOL.exeを起動するとプロセスと呼ばれます.次に、2つのプロセスと呼ばれるDOTA.exeを起動します.スレッド:スレッドはプロセスの内部で同時に行うことであり、例えばLOLでは、「ゲレン」が「ティモ」を撃ち殺し、「賞金ハンター」が「盲僧」を撃ち殺しているなど、多くのことを同時にしなければならない.これはマルチスレッドによって実現される.
ここでコードはマルチスレッドを使用しない場合を示しています.ゲレンがティモを殺した後、賞金ハンターが盲僧を殺し始めただけです.
マルチスレッドの作成-スレッドクラスの継承
マルチスレッドを使用すると、ゲレンがティモを攻撃すると同時に、賞金ハンターも盲僧を攻撃してKillThreadを設計することができます. Threadを継承しrunメソッド起動スレッドメソッドを書き換える:KillThreadオブジェクトをインスタンス化し、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()メソッドを実行します.
マルチスレッドの作成-匿名クラス
匿名クラスを使用して、Threadを継承し、runメソッドを書き換え、runメソッドに直接ビジネスコード匿名クラスを書くメリットの1つは、外部のローカル変数に容易にアクセスできることです.外部のローカル変数はfinalと宣言する必要があることを前提としています.(JDK 7以降は不要です)
マルチスレッドを作成する3つの方法
上記の3つの方法を整理してみます.1.Threadクラスを継承する2.Runnableインタフェースを実現する3.匿名クラスの方法注:起動スレッドはstart()メソッドであり、run()は新しいスレッドを起動することはできません
現在のスレッドを一時停止
Thread.sleep(1000);現在のスレッドが1000ミリ秒停止し、他のスレッドが影響を受けないことを示すThread.sleep(1000);InterruptedException割り込み異常が投げ出される.現在のスレッドsleepの場合、停止される可能性があるため、InterruptedExceptionが投げ出される
スレッドの概念
まず、プロセス(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();
}
}