Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по многопоточности 
V
    Опции темы
susanin
Дата 18.10.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 7



вобщем начал изучать многопоточность и тут возник вопрос при написании несложной программы
Код

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        frame = new JFrame();
        panel = new JPanel();
        JButton exit = new JButton("Exit");
        JButton start = new JButton("Start");
        
        exit.addActionListener(
                new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        panel.add(start);
        panel.add(exit);
        frame.add(panel);
        frame.setSize(200, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        start.addActionListener(
                new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                for(int i=0;i<3;i++)
                {
                Runnable r = new Run();
                Thread t = new Thread(r);
                t.start();
                }
            }
        });
    }
    private  static JFrame frame;
    private static JPanel panel;
}
class Run implements Runnable {
    
    public void run() {
        try
                {
                for(int j=0;j<10000;j++)
                {
                   System.out.println(j);
                    Thread.sleep(1);
                }
                }
                catch(InterruptedException ex){}
}
    public  synchronized void incr(){
        x++;
    }
    private int x=0;
}

по идее должны выводится числа по 3 одинаковых числа для каждого потока..
0
0
0
1
1
1
и тд.. вначале они так и выводятся... но после примерно шага 50 (бывает по разному) начинаютс сбои и выводится
30
30
30
31
31
32
32
31
33
33
32
33
34
34
34
как видно числа начинаю сбиваться...т.е. потоки начинаю опережать друг друга..это происходит из за маленькой задержки в sleep как я понимаю... и избежать можно этого используя блокирование потока...но вот по какому условию сделать блокирование в такой ситуации? подскажите пожалуйста и поправьте меня если я что то неправильно сказал..

PM MAIL   Вверх
ivg
Дата 19.10.2008, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Код

class Run implements Runnable {
    private static Object lock = new Object();
    private static volatile int count = 3;

    public void run() {
        try {
            for (int j = 0; j < 10000;) {
                System.out.println(j++);
                Thread.sleep(1);
                synchronized (lock) {
                    if (--count == 0) {
                        count = 3;
                        lock.notifyAll();
                    } else {
                        lock.wait();
                    }
                }
            }
        } catch (InterruptedException e) {}
    }
}


PM MAIL   Вверх
susanin
Дата 19.10.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 7



чтобы не создавать новую тему спрошу здесь еще один вопрос... smile 
Код

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Runnable r = new Run();
        for(int i=0;i<100;i++)
        {
        Thread t = new Thread(r);
        t.start();
        }
    }
}
class Run implements Runnable {
    public void run() {
        try
        {
        System.out.println(Thread.currentThread().getName()+" "+ x++);
        Thread.sleep(3);
        }
        catch(InterruptedException e){e.getMessage();}
}
    private int x;
}

почему в этом примере числа выводятся 
Thread-32 32
Thread-33 33
Thread-34 34
Thread-35 35
Thread-36 36
Thread-37 37
Thread-38 38
Thread-99 99
Thread-98 98
Thread-97 97
Thread-96 96
почему после 38 потока сразу идет 99 и потом по уменьшению?

PM MAIL   Вверх
dorogoyIV
Дата 19.10.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Цитата(susanin @  19.10.2008,  12:59 Найти цитируемый пост)
почему после 38 потока сразу идет 99 и потом по уменьшению?

несколько раз запусти прогу
PM MAIL   Вверх
susanin
Дата 19.10.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 7



Цитата(dorogoyIV @  19.10.2008,  13:14 Найти цитируемый пост)
несколько раз запусти прогу

шаг изменется но тем не меннее скачок на последний (99) шаг все равно происходит..почему происходит именно этот скачок?
PM MAIL   Вверх
Dummy
Дата 19.10.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 9
Всего: 19



susanin, нет оснований считать, что выполнение методов run() для сотни запущенных потоков происходит именно в том порядке, в котором ты вызывал для них start(). Неупорядоченность может быть вызвана:
  •  Особенностями алгоритмов управления потоками внутри JVM
  •  Моментом, к которому тот или иной тред успевает дойти до выполнения конкретного действия из метода run()
Для обеспечения заданного выполнения кода потоков нужно пользоваться встроенными средствами синхронизации wait() и notify(), а не полагаться на порядок, в котором они были запущены.
PM MAIL   Вверх
susanin
Дата 19.10.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 7



Dummy , спасибо за конкретный ответ! именно это я и предполагал, прост охотел убедится в своих предположениях..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1108 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.