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.
Dua cara yang paling biasa untuk kerjasama benang dalam Java: menggunakan Object.wait(), Object.notify() dan menggunakan Condition
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
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 melepaskan kunci
Benang Benang-0 memperoleh kunciKaedah 2Keadaan 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
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!