1. Prioritas utas
Contoh Penggunaan Prioritas Thread:
paket cn.galc.test; kelas publik testThread6 {public static void main (string args []) {myThread4 t4 = myThread4 baru (); MyThread5 t5 = myThread5 baru (); Utas T1 = utas baru (T4); Utas T2 = utas baru (T5); T1.SetPriority (thread.norm_priority + 3); // Gunakan metode setPriority () untuk mengatur prioritas utas, dan di sini prioritas utas T1 ditetapkan/** meningkatkan prioritas T1 berdasarkan level 3 berdasarkan norma, Norma, Norma. t1.start (); t2.start (); System.out.println ("prioritas utas T1 adalah:" + t1.getPriority ()); // Gunakan metode getPriority () untuk mendapatkan prioritas utas dan cetak prioritas T1 menjadi 8}} kelas myThread4 mengimplementasikan runnable {public void run () {for (int i = 0; i <= 1000; i ++) {System.println ("t1:"+i); }}} kelas myThread5 mengimplementasikan runnable {public void run () {for (int i = 0; i <= 1000; i ++) {System.out.println ("=================== T2:"+i); }}} Segera setelah metode run () berakhir, utas berakhir.2. Sinkronisasi utas
Contoh penggunaan kata kunci yang disinkronkan:
paket cn.galc.test; kelas publik testsync mengimplementasikan runnable {timer timer = new timer (); public static void main (string args []) {testsync test = testsync baru (); Utas T1 = utas baru (tes); Thread t2 = utas baru (tes); t1.setname ("t1"); // atur nama utas t1 t2.setname ("t2"); // atur nama utas t2 t1.start (); t2.start (); } public void run () {timer.add (thread.currentThread (). getName ()); }} class timer {private static int num = 0; Publik/ * disinkronkan */void add (nama string) {// Saat menambahkan disinkronkan ketika mendeklarasikan metode, itu berarti bahwa objek saat ini dikunci selama pelaksanaan metode ini disinkronkan (ini) {/ * * Gunakan disinkronkan (ini) untuk mengunci objek saat ini, sehingga tidak akan ada masalah dari dua utas yang berbeda yang mengakses sumber objek yang sama pada saat yang sama pada waktu yang sama. Hanya ketika satu utas mengaksesnya akan menjadi giliran utas berikutnya untuk mengakses */ num ++; coba {thread.sleep (1); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println (name + ": Anda adalah utas" + num + "menggunakan timer"); }}} Masalah Deadlock Thread:
Paket cn.galc.test;/*Applet ini mensimulasikan masalah deadlock utas*/kelas publik testDeadlock mengimplementasikan runnable {public int flag = 1; objek statis O1 = objek baru (), o2 = objek baru (); public void run () {System.out.println (thread.currentThread (). getName () + "flag =" + flag); /** Setelah menjalankan program, saya menemukan bahwa program telah mengeksekusi dan mencetak bendera, dan saya tidak akan pernah mengeksekusi pernyataan IF berikutnya lagi* Program mati di sini, tidak ada dijalankan atau keluar*//* Ini adalah utas flag = 1*/ if (flag == 1) {Synchronized (o1) {/* Gunakan kata kunci yang disinkronkan untuk kunci synchronized ke LOCKRONEF OBACT 01). } catch (InterruptedException e) {E.PrintStackTrace (); } disinkronkan (o2) { /** Objek O1 telah dikunci sebelumnya, asalkan dapat mengunci O2, Anda dapat mengeksekusi operasi pencetakan 1* Namun, objek O2 tidak dapat dikunci di sini, karena objek O1 telah dikunci dalam bendera utas lain = 0* Meskipun utas yang mengunci objek O2 akan tidur setiap 500 milidond, "itu masih ada (" BAGIAN BAWAH PETIK* Objek O2 akan tidur setiap 500 Milliseconds, itu masih Lock. }}}} /** Keduanya jika pernyataan di sini tidak akan dieksekusi karena mereka telah menyebabkan masalah deadlock utas* flag = 1 Thread ini menunggu flag = 0 utas ini membuka kunci kunci objek O2,* dan flag = 0 utas ini juga menunggu bendera = 1 utas ini membuka kunci objek objek o1* Namun, tidak satu pun dari utas ini yang disarankan* Bendera utas = 0*/ if (flag == 0) {disinkronkan (o2) {/*Di sini kita menggunakan sinkronisasi untuk mengunci objek O2 First*/ coba {thread.sleep (500); } catch (InterruptedException e) {E.PrintStackTrace (); } disinkronkan (O1) { / * * Objek O2 telah terkunci sebelumnya. Selama dapat mengunci O1, pengoperasian pencetakan 0 dapat dilakukan. Namun, objek O1 tidak dapat dikunci di sini, karena objek O1 telah dikunci di utas bendera lain = 1. Meskipun utas yang mengunci objek O1 akan tidur setiap 500 milidetik, masih mengunci O1 saat tidur*/ System.out.println ("0"); }}}} public static void main (string args []) {testDeadlock td1 = new testDeadlock (); TestDeadlock td2 = testDeadlock baru (); td1.flag = 1; td2.flag = 0; Utas T1 = utas baru (TD1); Utas T2 = utas baru (td2); t1.setname ("Thread td1"); t2.setname ("Thread td2"); t1.start (); t2.start (); }}Yang terbaik adalah menyelesaikan masalah benang yang hanya menemui satu objek, bukan dua objek secara bersamaan.
Pertanyaan produsen dan konsumen:
Paket cn.galc.test;/* Contoh Nama: Produser-Masalah Konsumer* Nama File Sumber: ProduserConsumer.java* Poin-Poin Kunci:* 1. Ketidakkonsistenan Data Bersama/Melindungi Sumber Daya Kritis* 2. Konsep Kunci Objek Java* 3. Sinkronisasi Kata Kunci/Tunggu/Tunggu () dan Metode () Metode*/Kelas Public Class Publik. stack = SyncStack baru (); Runnable p = produser baru (stack); Runnable c = konsumen baru (stack); Utas P1 = utas baru (p); Utas C1 = utas baru (c); p1.start (); c1.start (); }} class SyncStack {// Implementasi tumpukan yang mendukung operasi sinkronisasi multithread private int index = 0; Data Private Char [] = Char baru [6]; publy void push (char c) {if (index == data.length) {coba {this.wait (); } catch (InterruptedException e) {}} this.notify (); data [indeks] = c; indeks ++; } public disinkronkan char pop () {if (index == 0) {coba {this.wait (); } catch (InterruptedException e) {}} this.notify (); indeks--; pengembalian data [indeks]; }} produser kelas mengimplementasikan runnable {syncstack stack; produser publik (SyncStack s) {stack = s; } public void run () {for (int i = 0; i <20; i ++) {char c = (char) (math.random ()*26+'a'); stack.push (c); System.out.println ("Diproduksi:"+C); coba {thread.sleep ((int) (math.random ()*1000)); } catch (InterruptedException e) {}}}} kelas konsumen mengimplementasikan runnable {syncstack stack; konsumen publik (syncstack s) {stack = s; } public void run () {for (int i = 0; i <20; i ++) {char c = stack.pop (); System.out.println ("Konsumsi:"+C); coba {thread.sleep ((int) (math.random ()*1000)); } catch (InterruptedException e) {}}}}Di atas adalah pengantar lengkap untuk benang java. Anda dapat menggabungkan artikel pertama "Java harus belajar dan mempelajari utas (1)" untuk belajar, berharap itu dapat membantu Anda.