Javaのマルチスレッド

Javaには、スレッド用のThreadクラスとRunnableインターフェースが用意されています。どちらにも、スレッドを実行するrun()メソッドが含まれています。一般的なメソッドは次のとおりです。

スレッドの作成と停止

Threadクラスを継承して新しいスレッドクラスを作成するか、Runnableインターフェイスを実装して新しいクラスを作成できます。スレッドには、それを識別する名前属性があります。setName()メソッドを呼び出して設定するか、新しいThreadオブジェクトを作成して文字列を渡してスレッドに名前を付けるときにコンストラクターを呼び出すことができます。getName()を使用してThreadクラスのスレッドの名前を取得できます。Runnableを実装するためのそのようなメソッドはありません。Thread.currentThread()を使用して名前を取得できます。Threadクラスを継承する場合でも、Runnableインターフェイスを実装する場合でも、run()メソッドをオーバーロードし、run()でスレッドによって実行される操作を定義する必要があります。スレッドオブジェクトが作成された後、start()メソッドを呼び出すことによってrun()のコンテンツが実行されます。

スレッドの停止では、stop()またはinterrupt()を使用できませんが、スレッドの実行を制御するには、子スレッドでフラグを設定する必要があります。たとえば、サブスレッドはサブスレッドのvolatile変数によって制御されます。停止する必要がある場合は、メインプロセスで変数にアクセスし、falseに設定してループを終了できます。このようにして、子プロセスは後でコンテンツを実行し続け、クリーニング作業などを実行してから、子プロセスを終了できます。

以下に示すように、2つの低レベルスレッドthread1とthread2が最初にメインプロセスで作成され、start()によって開始された後、交互に実行されます。各実行は、yield()によってプロセッサを譲り、再び競合します。次に、runFlagを使用して2つの低レベルスレッドを手動で停止してから、高レベルスレッドhighThreadを作成して実行します。最後に、highThread実行の終了がメインプロセスを終了するまで待ちます。

//低级进程类
public class LowThread implements Runnable {//通过实现接口来新建线程类
    volatile boolean runFlag = true;     //通过标记来控制循环的执行
    @Override
    public void run() {
        int count = 1;
        String threadName=Thread.currentThread().getName();
        while (runFlag) {
            System.out.println(threadName + "线程循环次数:" + count++);
            Thread.yield();             //每循环一次让出处理器,重新和其他线程竞争处理器
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(threadName+"执行结束");
    }
}

//高级进程类
public class HighThread extends Thread { //通过继承Thread类来新建一个线程类

    public void run() {
        System.out.println(getName() + "执行!");    //Thread类内通过getName()获取线程名
    }
}

//主进程
public class RunThread {
    public static void main(String[] args) throws InterruptedException {
        LowThread thread1Run=new LowThread();   //新建RUnnable对象
        Thread thread1=new Thread(thread1Run,"线程1");        //使用Runnable对象初始化Thread
        thread1.start();                 //线程启动,自动执行run()方法

        LowThread thread2Run=new LowThread();
        Thread thread2=new Thread(thread2Run,"线程2");
        thread2.start();
        Thread.sleep(50);       //主线程休眠让出处理器,让thread1和2使用处理器执行

        System.out.println("高级线程切入");
        thread1Run.runFlag=false;       //在线程外通过volatile变量控制低级线程停止
        thread2Run.runFlag=false;
        HighThread highThread=new HighThread();
        highThread.setName("高级别线程");
        highThread.start();
        highThread.join();          //让其他线程等待直到高级线程执行结束,否则会先执行主线程,输出下一句
        System.out.println("主线程执行结束");
    }
}

実行ステータスは次のとおりです。上位プロセスが最初に終了し、子プロセスがメインプロセスの後に停止することがわかります。関連するクリーニングやその他の作業を実行できます。

スレッドの相互排除と同期

Javaは、新しいオブジェクトロックを作成することにより、重要なリソースへのアクセスを制御します。同期は、synchronizedキーワードによって制御されます。クリティカルセクションに入ると、条件が最初に判断され、条件が満たされると入力されます。そうでない場合、スレッドはウェイトセットのウェイトセットに入れられ、クリティカルセクションコードが実行され、実行後にnotify()/ notifyAll()が呼び出されます他のプロセスに通知して、リソースを再び競合させます。

private final Object lockObj = new Object();

synchronized (lockObj) {

    //进入临界区的条件判断
    while (条件) {
        try {
            //条件不满足, 将当前线程放入Wait Set
            lockObj.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    //执行临界区代码
    func();
    
    //唤醒所有在lockObj对象上等待的线程
    lockObj.notifyAll();
}

 

元の記事124件を公開 65のような 130,000 以上を 訪問

おすすめ

転載: blog.csdn.net/theVicTory/article/details/104206888
おすすめ