1. Приоритет потоков
Примеры использования приоритета потока:
пакет cn.galc.test; public class testthread6 {public static void main (string args []) {mythread4 t4 = new mythread4 (); Mythread5 t5 = new mythread5 (); Потока T1 = новый поток (T4); Потока T2 = новый поток (T5); T1.SetPriority (Thread.Norm_Priority + 3); // Использование метода setPriority () для установки приоритета потоков, и здесь устанавливается приоритет потоков T1/** Увеличьте приоритет потока T1 на уровне 3 на основе нормального приоритета (norm_poriority)* Таким образом, время исполнения T1 будет намного больше, чем то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, на то, что T2*, что является значением, но нормальности - значит, что значит, что значит, что значит, что значит, что значит, что значит, что значит, что значит, что значит, что значит, что значит. t1.start (); t2.start (); System.out.println ("Приоритет потока T1:" + t1.getPriority ()); // Используйте метод getPriority (), чтобы получить приоритет потока и распечатать приоритет T1 как 8}} класс MyThread4 Реализации Runnable {public void run () {for (int i = 0; i <= 1000; i ++) {System.out.println ("t1:"+i); }}} класс mythread5 реализует runnable {public void run () {for (int i = 0; i <= 1000; i ++) {System.out.println ("================== t2:"+i); }}} Как только метод run () заканчивается, поток заканчивается.2. Синхронизация потока
Примеры синхронизированного использования ключевых слов:
пакет cn.galc.test; public class testsync реализует runnable {timer timer = new Timer (); public static void main (String args []) {testSync test = new TestSync (); Потока T1 = новый поток (тест); Потока T2 = новый поток (тест); t1.setName ("t1"); // Установить имя потока t1 t2.setname ("t2"); // Установить имя потока t2 t1.start (); t2.start (); } public void run () {timer.add (thread.currentThread (). getName ()); }} таймер класса {private static int num = 0; public/ * synchronized */void add (string name) {// При добавлении синхронизации при объявлении метода это означает, что текущий объект заблокирован во время выполнения этого метода синхронизированного (это) {/ * * Использовать синхронизированный (этот) для блокировки текущего объекта, так что не будет проблем с двумя разными потоками, доступа к одному объектному ресурсу в одно и то же время. Только когда один поток доступ к обращению следующего потока для доступа */ num ++; try {thread.sleep (1); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println (name + ": вы - потоки" + num + "с использованием таймера"); }}} Проблема с тупиком потока:
Пакет cn.galc.test;/*Этот апплет имитирует проблему тупика потока*/public class testdeadlock реализует Runnable {public int flag = 1; Статический объект O1 = новый объект (), O2 = новый объект (); public void run () {System.out.println (think.currentThread (). getName () + "flag =" + flag); /** После запуска программы я обнаружил, что программа выполнила ее и распечатала флаг, и я никогда не выполню последующий оператор IF снова* Программа умерла здесь, не выполняя и не выходя*//* Это флаг потока = 1*/ if (flag == 1) {синхронизированный (O1) {/* Использовать ключевое слово Synchronized, чтобы заблокировать объект 01*/ tress {trate. } catch (прерванное искусство e) {e.printstacktrace (); } Синхронизированный (O2) { /** Объект O1 был заблокирован ранее, если он может заблокировать O2, вы можете выполнить операцию печати 1* Однако объект O2 не может быть заблокирован здесь, потому что объект O1 был заблокирован в другом флаге потока = 0*, хотя нить, которая блокирует объект O2, будет спать каждые 500 миллисекундов, он все еще блокирует O2, когда ссып* / System.out. }}}} /** Оба, если операторы здесь не будут выполнены, потому что они вызвали проблему тупика потока потока* flag = 1. Этот поток ждет флага = 0. Этот поток разблокирует блокировку объекта o2,* и flag = 0. Этот поток также ждет флаг = 1. Этот поток заблокирует объект o1* Однако ни один из этих потоков не готов, чтобы сфотографировать объект, так что это заблокированная задача. flag = 0*/ if (flag == 0) {synchronized (o2) {/*Здесь мы используем синхронизированный для блокировки объекта o2 first*/ try {thread.sleep (500); } catch (прерванное искусство e) {e.printstacktrace (); } синхронизированный (O1) { / * * Объект O2 был заблокирован ранее. Пока он может заблокировать O1, можно выполнить работу. Однако объект O1 здесь не может быть заблокирован, потому что объект O1 был заблокирован в другом потоке Flag = 1. Хотя поток, который блокирует объект O1, будет спать каждые 500 миллисекунд, он все еще блокирует O1 во время сна*/ System.out.println ("0"); }}}} public static void main (string args []) {testDeadlock td1 = new TestDeadlock (); Testdeadlock td2 = new testdeadlock (); td1.flag = 1; td2.flag = 0; Потока T1 = новый поток (TD1); Потока T2 = новый поток (TD2); t1.setName ("Thread TD1"); t2.setName ("Thread TD2"); t1.start (); t2.start (); }}Лучше всего решить проблему сношения потока только одного объекта, а не два объекта одновременно.
Производитель и потребительские вопросы:
Пакет CN.Galc.Test;/* Пример Имя: Производитель-Задача с потребителями* Имя исходного файла: ProducterConsumer.java* Ключевые моменты:* 1. Несоответствие общих данных/защита критических ресурсов* 2. Концепция Java Object Lock* 3. Synchronized Keyword/wait () и Notify () Методы*/Public Productcumer {public STATIC void main (string rascScscSc rabscSc rabscscScACCACCACCACCACCACCACCACCAC новый SyncStack (); Runnable P = новый производитель (стек); Заполнимый C = новый потребитель (стек); Поток P1 = новый поток (P); Потока C1 = новый поток (C); p1.start (); c1.start (); }} класс SyncStack {// реализация стеков, которые поддерживают операции синхронизации многопоточной синхронизации private int index = 0; private char [] data = new char [6]; public Synchrinized void push (char c) {if (index == data.length) {try {this.wait (); } catch (прерывание Exception e) {}} this.notify (); данные [index] = c; index ++; } public synchronized char pop () {if (index == 0) {try {this.wait (); } catch (прерывание Exception e) {}} this.notify (); Индекс-; вернуть данные [index]; }} Производитель класса реализует runnable {syncStack Stack; Public Producer (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 («Производится:»+c); try {thread.sleep ((int) (math.random ()*1000)); } catch (прерывание Exception e) {}}}} класс потребитель реализует runnable {syncStack Stack; Общественный потребитель (SyncStack S) {Stack = s; } public void run () {for (int i = 0; i <20; i ++) {char c = stack.pop (); System.out.println ("потребление:"+c); try {thread.sleep ((int) (math.random ()*1000)); } catch (прерывание Exception e) {}}}}Приведенное выше - полное введение в нити Java. Вы можете объединить первую статью «Ява должна изучать и изучить темы (1)», чтобы выучить, надеясь, что это может помочь вам.