java第10章マルチスレッド

目的:

      1.スレッドの概念とスレッドのライフサイクルを理解します。

       2.マルチスレッドプログラミングをマスターします。

実験内容:

       1.Threadクラスを継承してスレッドを作成します。

       2.Runnableインターフェイスを実装してスレッドを作成します。

       3.スレッド優先操作。

       4.2つのスレッドで数字を推測するゲームをプレイします。

実験ステップ:

1. Threadクラスを継承してスリープ(1〜5秒)を実装するスレッドを作成し、そのスリープ時間とスレッド名を表示します。

ソースコード:

 

package homework.实验10_多线程;

public class sy10_1 {
    public static void main(String[] args) {
        Runner1 r = new Runner1();
        r.start();
        for (int i = 0; i < 3; i++) {
            if(i==2){
                try {
                    Runner1.sleep(1000); //此处是类名.sleep()

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Runner1.currentThread().getName()+"当前运行的线程名称: "+ i);
        }
    }
}




 

class Runner1 extends Thread{
    public void run() {
        for (int i = 0; i < 5; i++) {
            if(i==4){
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println(Runner1.currentThread().getName()+"当前运行的线程名称: "+ i);
        }
    }
}

2. 3つのスレッドオブジェクトを生成する必要があるRunnableインターフェイスを実装してスレッドを作成し、3つのスレッドのスリープ時間を別々に設定します。スレッドAは1秒間スリープし、スレッドBは2秒間スリープし、スレッドCは3秒間スリープします。

ソースコード:

package homework.实验10_多线程;

public class sy10_2 {
    public static void main(String[] args){
        new Thread(new Sleep("线程A", 1000)).start();
        new Thread(new Sleep("线程B", 2000)).start();
        new Thread(new Sleep("线程C", 3000)).start();
    }
}

class Sleep  implements Runnable{
    public long time;
    public String name;

    public Sleep(String name, long time){
        this.name = name;
        this.time = time;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            Thread.sleep(this.time);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(this.name+"休眠"+this.time+"毫秒");
    }

}

 

3. 3つのスレッドを作成して、1つのスレッドの優先度が最も高く、1つのスレッドの優先度が最も低く、1つのスレッドの優先度がその間にあるようにします。各スレッドの名前とその優先度を表示する必要があります。

ソースコード:

package homework.实验10_多线程;

public class sy10_3 {
    public static void main(String[] args){
        Thread t1 = new Thread(new PriThread());
        Thread t2 = new Thread(new PriThread());
        Thread t3 = new Thread(new PriThread());
        t1.setPriority(Thread.MAX_PRIORITY);
        t2.setPriority(6);
        t3.setPriority(Thread.MIN_PRIORITY);
        t1.start();
        t2.start();
        t3.start();
    }
}


class PriThread implements Runnable{
    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println(Thread.currentThread().getName()+"的优先级是:"
                +Thread.currentThread().getPriority()+"");
    }

}

4. 2つのスレッドを使用して、数字を推測するゲームをプレイします。最初のスレッドは1から100までの整数をランダムに与える役割を果たし、2番目のスレッドは数字を推測する役割を果たします。2番目のスレッドが独自の推測を行うたびに、最初のスレッドが「小さいと推測する」、「大きいと推測する」、または「正しく推測する」というプロンプトを表示する必要があります。

ソースコード:

package homework.实验10_多线程;

import java.util.*;
import java.util.Random;

public class sy10_4{

    public static void main(String[] args) {
        number num=new number("线程一");
        num.start();
        guess gue=new guess("线程二");
        gue.start();
    }

}
//给出整数的线程
class number extends Thread{
    String name1;
    private static int n;
    number(String name){
        name1=name;
    }
    public void run() {
        //获取1~100的随机数
        Random random=new Random();
        n=random.nextInt(100);
        System.out.println(name1+"给出的数字为:"+n);
    }
    //猜数字(静态方法,可通过类名调用)
    public static String guessnum(int m) {
        if(m<n) {
            return "猜小了";
        }else if(m>n){
            return "猜大了";
        }else return "猜对了";
    }
}
//猜数线程
class guess extends  Thread{
    String name2;
    //最大值和最小值
    private int min=0,max=100,nownum;
    //比较结果
    String Result;
    guess(String name){
        name2=name;
    }
    //获取比较结果
    public String getGuess() {
        return Result;
    }
    public void run() {
        while(true) {
            try{
                Thread.sleep(2000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            Random ran=new Random();
            //当前猜的数字(最大值和最小值之间的数)
            nownum=min+ran.nextInt(max-min);
            //调用给出整数的线程 的猜数字方法guessnum,
            Result=number.guessnum(nownum);
            if(Result.equals("猜小了")) {
                min=nownum;
                System.out.println("线程二猜的数字是:"+nownum+"---猜小了");
            }else if(Result.equals("猜大了")) {
                max=nownum;
                System.out.println("线程二猜的数字是:"+nownum+"---猜大了");
            }else {
                System.out.println("线程二猜的数字是:"+nownum+"---猜对了,结果是"+nownum);
                System.exit(0);
            }

        }
    }
}

 

実行結果のスクリーンショット:

 

実験概要

     プロセスとスレッド

      プロセスは、プログラムの動的な実行プロセスであり、コードのロード、コードの実行から完了までの完全なプロセスを経る必要があります。このプロセスは、生成、開発、最終的な終了までのプロセス自体のプロセスでもあります。マルチプロセスオペレーティングシステムは、複数のプロセス(プログラム)を同時に実行できます。CPUには時間共有メカニズムがあるため、各プロセスは独自のCPUタイムスライスを周期的に取得できます。CPUは非常に高速に実行されるため、すべてのプログラムが同時に実行されているように見えます。

 

      マルチスレッドは、同時実行メカニズムを実現するための効果的な手段です。スレッドのようなプロセスは、並行性の基本単位です。スレッドはプロセスよりも小さな実行単位であり、スレッドはプロセスに基づいてさらに分割されます。いわゆるマルチスレッドとは、プロセスが実行中に複数の小さなプログラムユニットを生成できることを意味します。これらの小さなユニットはスレッドと呼ばれます。これらのスレッドは同時に存在し、同時に実行できます。プロセスには、同時に実行される複数のスレッドが含まれる場合があります。

 

Javaでスレッドを実装する方法

      Javaでマルチスレッドを実装する方法は2つあります。1つはThreadクラスを継承する方法で、もう1つはRunnableインターフェイスを実装する方法です。

Runnableインターフェースの実装例:

class MyThread implements Runnable{ // 实现Runnable接口,作为线程的实现类

    private String name ;       // 表示线程的名称

    public MyThread(String name){

        this.name = name ;      // 通过构造方法配置name属性

    }

    public void run(){  // 覆写run()方法,作为线程 的操作主体

        for(int i=0;i<10;i++){

            System.out.println(name + "运行,i = " + i) ;

        }

    }

};

public class RunnableDemo01{

    public static void main(String args[]){

        MyThread mt1 = new MyThread("线程A ") ;    // 实例化对象

        MyThread mt2 = new MyThread("线程B ") ;    // 实例化对象

        Thread t1 = new Thread(mt1) ;       // 实例化Thread类对象

        Thread t2 = new Thread(mt2) ;       // 实例化Thread类对象

        t1.start() ;    // 启动多线程

        t2.start() ;    // 启动多线程

    }

};

 

スレッドインターフェイスを実装する

class MyThread extends Thread{  // 继承Thread类,作为线程的实现类

    private String name ;       // 表示线程的名称

    public MyThread(String name){

        this.name = name ;      // 通过构造方法配置name属性

    }

    public void run(){  // 覆写run()方法,作为线程 的操作主体

        for(int i=0;i<10;i++){

            System.out.println(name + "运行,i = " + i) ;

        }

    }

};

public class ThreadDemo02{

    public static void main(String args[]){

        MyThread mt1 = new MyThread("线程A ") ;    // 实例化对象

        MyThread mt2 = new MyThread("线程B ") ;    // 实例化对象

        mt1.start() ;   // 调用线程主体

        mt2.start() ;   // 调用线程主体

    }

};

 

       プログラムから、2つのスレッドオブジェクトが千鳥状に実行されていることがわかります。どのスレッドオブジェクトがCPUリソースを取得し、どのスレッドを実行できるかは、スレッドが開始されるたびにプログラムの結果が異なる必要があります。これはstart()メソッドですが、実際に呼び出されるのはrun()メソッドによって定義された本体です。

 

スレッドステータスの変更

      マルチスレッドを実現するには、メインスレッドに新しいスレッドオブジェクトを作成する必要があります。通常、スレッドには5つの状態があります。つまり、作成済み、準備完了、実行中、ブロック済み、および終了です。

 

创建:スレッドthread = new Thread()

準備完了:スレッドのstart()メソッドを呼び出して、スレッドを開始します。

実行中:準備完了状態が呼び出され、プロセッサリソースが取得されると、スレッドは実行状態になります。このとき、スレッドオブジェクトのrun()メソッドが自動的に呼び出されます。run()メソッドは、スレッドの操作と機能を定義します。

ブロッキング:sleep()、suspend()、wait()などのメソッドを呼び出すと、スレッドはブロッキング状態になります

終了:スレッドがstop()メソッドを呼び出すか、run()メソッドの実行が終了した後、スレッドは停止します。デッド状態のスレッドには、実行を継続する機能がありません。

 

      Javaのスレッド操作では、すべてのスレッドが実行前に準備完了状態のままになります。このとき、優先度の高いスレッドが優先され、最初に実行される可能性があります。

 

おすすめ

転載: blog.csdn.net/qq_45176548/article/details/112393313