Rumah >Java >javaTutorial >Apakah cara untuk benang Java bekerjasama?

Apakah cara untuk benang Java bekerjasama?

王林
王林ke hadapan
2023-05-17 20:34:151497semak imbas

Mengapakah benang perlu bekerjasama?

Benang bekerjasama antara satu sama lain untuk menyelesaikan kerja tertentu Contohnya: satu utas mengubah suai nilai objek, dan utas lain merasakan perubahan itu dan kemudian melakukan yang sepadan. operation. , keseluruhan proses bermula dalam satu utas, dan pelaksanaan terakhir adalah dalam utas lain. Melalui model ini, pengeluar dan pengguna dipisahkan, dengan itu mencapai pengasingan "Apa" dan "Bagaimana". Cara mudah ialah membiarkan benang pengguna terus bergelung untuk memeriksa sama ada pembolehubah memenuhi jangkaan, menetapkan keadaan yang tidak berpuas hati dalam gelung while dan keluar dari gelung while jika syarat dipenuhi, dengan itu menyelesaikan kerja pengguna. Terdapat dua masalah dengan kerjasama jenis ini antara rangkaian:

(1) Sukar untuk memastikan ketepatan masa.

(2) Sukar untuk mengurangkan overhed. Jika masa tidur dikurangkan, seperti tidur selama 1 milisaat, pengguna boleh mengesan perubahan dalam keadaan dengan lebih cepat, tetapi ia mungkin menggunakan lebih banyak sumber pemproses, menyebabkan pembaziran yang tidak perlu.

Pengenalan

Dua cara yang paling biasa untuk kerjasama benang dalam Java: menggunakan Object.wait(), Object.notify() dan menggunakan Condition

Kaedah 1

Kaedah tunggu, maklumkan, dan maklumkanSemua dalam Objek ditakrifkan seperti berikut

  • maklumkan void asal akhir awam (); (masa tamat masa) membuang InterruptedException;

  • wait(), notify() dan notifyAll() kaedah adalah kaedah setempat dan merupakan kaedah muktamad dan tidak boleh ditindih

  • Panggil kaedah tunggu() objek untuk menyekat utas semasa dan utas semasa mesti memiliki monitor (iaitu kunci) objek ini

  • Panggil pemberitahuan tentang objek Kaedah () boleh membangunkan utas yang sedang menunggu untuk memantau objek ini Jika terdapat berbilang utas menunggu untuk memantau objek ini, hanya satu daripada utas boleh dibangunkan

  • <. . kerana setiap objek memiliki monitor kunci>

    Untuk memanggil kaedah tunggu() objek, benang semasa mesti memiliki monitor (iaitu kunci) objek ini, jadi memanggil kaedah wait() mesti dilakukan dalam blok yang disegerakkan atau kaedah yang disegerakkan
  • Contoh
  • public class Test {
        public static Object object = new Object();
        public static void main(String[] args) {
            Thread1 thread1 = new Thread1();
            Thread2 thread2 = new Thread2();
            thread1.start();
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            thread2.start();
        }
        static class Thread1 extends Thread{
            @Override
            public void run() {
                synchronized (object) {
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                    }
                    System.out.println("线程"+Thread.currentThread().getName()+"获取到了锁");
                }
            }
        }
        static class Thread2 extends Thread{
            @Override
            public void run() {
                synchronized (object) {
                    object.notify();
                    System.out.println("线程"+Thread.currentThread().getName()+"调用了object.notify()");
                }
                System.out.println("线程"+Thread.currentThread().getName()+"释放了锁");
            }
        }
    }

    Hasil yang dijalankan

Benang Benang-1 dipanggil object.notify()

Benang Benang-1 melepaskan kunci

Benang Benang-0 memperoleh kunci

Kaedah 2



Keadaan hanya muncul dalam java 1.5, ia digunakan untuk menggantikan Objek tradisional The wait() dan notify() Condition1 merealisasikan kerjasama antara thread Berbanding dengan menggunakan wait() dan notify() Object, ia lebih selamat dan lebih cekap untuk menggunakan await() dan signal() Condition1 untuk merealisasikan kerjasama antara thread

    Condition ialah antara muka, kaedah asasnya menunggu() dan kaedah signal()
  • Keadaan bergantung pada antara muka Kunci untuk menjana kod asas bagi Keadaan Ia adalah lock.newCondition()
  • yang memanggil Keadaan menunggu() dan memberi isyarat () kaedah mestilah dalam perlindungan kunci, iaitu, ia mesti berada dalam lock.lock() dan lock Ia hanya boleh digunakan antara buka kunci
  • Contoh
  • public class Test {
        private int queueSize = 10;
        private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);
        private Lock lock = new ReentrantLock();
        private Condition notFull = lock.newCondition();
        private Condition notEmpty = lock.newCondition();
        public static void main(String[] args)  {
            Test test = new Test();
            Producer producer = test.new Producer();
            Consumer consumer = test.new Consumer();
            producer.start();
            consumer.start();
        }
        class Consumer extends Thread{
            @Override
            public void run() {
                consume();
            }
            private void consume() {
                while(true){
                    lock.lock();
                    try {
                        while(queue.size() == 0){
                            try {
                                System.out.println("队列空,等待数据");
                                notEmpty.await();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        queue.poll();                //每次移走队首元素
                        notFull.signal();
                        System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");
                    } finally{
                        lock.unlock();
                    }
                }
            }
        }
        class Producer extends Thread{
            @Override
            public void run() {
                produce();
            }
            private void produce() {
                while(true){
                    lock.lock();
                    try {
                        while(queue.size() == queueSize){
                            try {
                                System.out.println("队列满,等待有空余空间");
                                notFull.await();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        queue.offer(1);        //每次插入一个元素
                        notEmpty.signal();
                        System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
                    } finally{
                        lock.unlock();
                    }
                }
            }
        }
    }
    .

Atas ialah kandungan terperinci Apakah cara untuk benang Java bekerjasama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam