Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Исправленный пример

Пояснения к примеру | Демонстрационный пример | Как организовать нить | С нитями выполнения нужно быть осторожным | Завершение и останов нити | Интерфейс Runable | Диспетчеризация нитей | Конкурентный доступ к ресурсам при многопоточной обработке | Демонстрационный пример | Средства синхронизации нитей в Java |


Читайте также:
  1. I) Эффективность военных преобразований 1860-1870-х годов на примере Русско-японской войны.
  2. I. Примерный перечень вопросов рубежного контроля.
  3. II. Примерный перечень вопросов к зачету (экзамену) по всему курсу.
  4. III. РАЗЛИЧНЫЕ СХЕМЫ УПРАВЛЕНИЯ ГОСУДАРСТВЕННОЙ СОБСТВЕННОСТЬЮ: ПРИМЕРЫ ИЗ ИСТОРИЧЕСКОГО ОПЫТА И ЗАРУБЕЖНОЙ ПРАКТИКИ
  5. Look at the family tree and complete the sentences as in the example (Посмотри на семейное древо и заполни пропуски как в примере).
  6. Lt;question>Выберите правильный пример аннотации.
  7. XVI. Переведите на калмыцкий язык, заменяя подчеркнутые слова предложенными примерами.

Для того, чтобы рассмотренный выше пример ThreadExample6.java работал правильно, нам необходимо синхронизировать доступ к полю randValue. Но это поле является элементарным данным, поэтому использовать его в качестве блокируемого ресурса нельзя. В таких случаях блокируют сам объект, которому принадлежит поле. У нас это объект основного класса приложения.

Далее нужно выделить критические участки. Один из них — это порождение нового случайного числа.

randValue = rnd.nextInt();

Этот участок мы заключим в блок.

Второй — это фрагмент, в котором вычисляется контрольная сумма с использованием randValue. Исключительно ради разнообразия мы выделим его в отдельный метод с именем check. Правда при этом нужно учесть, что для метода блокируемый объект — это объект того класса, которому принадлежит данный метод. Поэтому метод check должен быть обязательно методом нашего основного класса, а не методом вложенного класса ShowRandom.

Листинг исправленной программы ThreadExample7.java приведен ниже

// ThreadExample7.java

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.*;

 

public class ThreadExample7 extends JFrame implements Runnable {

 

JTextField txt1 = new JTextField(10);

JTextField txt2 = new JTextField(10);

JTextField txtTime = new JTextField(19);

JTextField txt3 = new JTextField(10);

int randValue = 0;

long numbOfRand = 0;

Thread sth = null;

JButton sbtn;

int checkSum = 0;

private boolean runFlag = false;

 

ThreadExample7() {

super("Знакомство с нитями (часы)");

 

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

}

catch(Exception e) {

}

 

setSize(400, 300);

Container c = getContentPane();

JPanel pnm = new JPanel(new GridLayout(2, 1, 5, 5));

c.add(pnm, BorderLayout.CENTER);

JPanel pn1 = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));

JPanel pn2 = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));

JPanel pn3 = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5));

pnm.add(pn1);

pnm.add(pn2);

pnm.add(pn3);

pn1.add(new JLabel("Номер числа "));

pn1.add(txt1);

txt1.setEnabled(false);

pn2.add(new JLabel("Случайное число"));

pn2.add(txt2);

txt2.setEnabled(false);

pn3.add(new JLabel("Контрольная сумма"));

pn3.add(txt3);

txt3.setEnabled(false);

JPanel pntop = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));

sbtn = new JButton("Показать время");

pntop.add(sbtn);

pntop.add(txtTime);

txtTime.setEnabled(false);

txtTime.setEditable(false);

c.add(pntop, BorderLayout.NORTH);

sbtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

if (sth == null) {

sth = new Thread(ThreadExample7.this);

sth.start();

}

switchOnOff();

sbtn.setText(isOn()? "Остановить часы": "Показать

время");

}

});

 

WindowListener wndCloser = new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

};

addWindowListener(wndCloser);

 

setVisible(true);

 

class ShowRandom extends Thread {

 

public void run() {

while(true) {

check();

txt3.setText(String.valueOf(checkSum));

try {

Thread.sleep(200);

} catch(InterruptedException e) {

}

}

}

}

Thread[] th = new Thread[10];

for (int i = 0; i < 10; i++) {

th[i] = new ShowRandom();

th[i].start();

}

 

Random rnd = new Random();

for(;;numbOfRand++) {

synchronized(this) {

randValue = rnd.nextInt();

}

try {

Thread.sleep(100);

} catch(InterruptedException e) {

}

}

}

 

public void run() {

while (true) {

if (runFlag) {

Date dt = new Date();

txtTime.setText(dt.toString());

} else {

txtTime.setText("");

}

try {

Thread.sleep(500);

} catch(InterruptedException e) {

}

}

}

 

public boolean isOn() {

return runFlag;

}

 

public void switchOnOff() {

runFlag =!runFlag;

}

 

public synchronized void check() {

checkSum += randValue;

txt1.setText(String.valueOf(numbOfRand));

txt2.setText(String.valueOf(randValue));

checkSum -= randValue;

}

 

public static void main(String[] args) {

new ThreadExample7();

}

}

Запустив этот пример, мы обнаружим, что сколько бы программа не работала, поле контрольной суммы останется нулевым.

 


Дата добавления: 2015-08-18; просмотров: 84 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
За все приходится платить| Блокировки нитей

mybiblioteka.su - 2015-2024 год. (0.008 сек.)