Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2016, 20:21   #1
noxior
Пользователь
 
Регистрация: 27.11.2011
Сообщений: 28
По умолчанию почему треды не синхронизируются?

Задача в том чтобы 2 или 3, или 10 тредов(неважно), поочереди(каждый тред поочереди через одну секунду) декрементировали переменную. Сначала просто писал метод и синхронизировал его, потом по объекту делал синхронизацию, тепер делаю все напрямую в методе run, но все равно все треды работают пачкой, и только после выполнения одной итерации, обратно же, все вместе пачкой засыпают. Как последовательно разделить работу? почему синхронизщация не помагает?

Код:
package nhg;

import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;

public class qq {
    public static void main (  String [] args ) throws UnknownHostException, InterruptedException {
        for (int i = 0; i < 2; i++) {
            new The().start();
        }
    }

    public static class The extends Thread {
        private volatile static int q = 10;

        private final Object lock;

        The(){
            lock = new Object();
        }

        @Override
        public void run() {
            synchronized (lock) {
                for (q = 10; q > 0; q--) {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        System.out.println("qqq");
                    }
                    System.out.println(currentThread().getName() + " lift vniz " + q);
                }
                Thread.yield();
            }
        }
    }
}
noxior вне форума Ответить с цитированием
Старый 09.10.2016, 23:08   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

объект блокировки у каждого потока свой собственный, чего ему другой поток ждать?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.10.2016, 16:53   #3
noxior
Пользователь
 
Регистрация: 27.11.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
объект блокировки у каждого потока свой собственный, чего ему другой поток ждать?
тогда как осуществить чтобы синхронизация работала как надо?
как сделать таймер чтобы был обратный отсчет?
noxior вне форума Ответить с цитированием
Старый 10.10.2016, 17:56   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

таймер не делают кучей потоков

чтоб синхронизация работала как надо, надо чтоб у потоков был общий объект синхронизации.
обратите внимание на переменную счетчика
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.10.2016, 18:02   #5
noxior
Пользователь
 
Регистрация: 27.11.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
таймер не делают кучей потоков

чтоб синхронизация работала как надо, надо чтоб у потоков был общий объект синхронизации.
обратите внимание на переменную счетчика
Но ведь это же возможно) я неспорю что можно сделать намного проще, я просто хочу понять и больше не возвращаться к этому вопросу)

вот к примеру тоже наваял пример(простите за игру слов):
public class qq {
public static void main ( String [] args ) throws UnknownHostException, InterruptedException {
for (int i = 0; i < 5; i++) {
new The().start();
}
}

public static class The extends Thread {

final Counter c = new Counter();

@Override
public synchronized void run() {
while (true) {
c.c();
}
}
}

public static class Counter{

public synchronized void c(){
try {
Thread.sleep(1000);
System.out.println("qq");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

Нужно чтобы надпись выводилась раз в секунду, какой поток будет делать это абсолютно не важно. важно чтобы один поток зашел в тело метода, остановился на секунду, выполнил вывод, и потом зашел другой поток на выполнение. ОбЪясните пожалуйста, как делается сие невежество((
noxior вне форума Ответить с цитированием
Старый 10.10.2016, 18:12   #6
noxior
Пользователь
 
Регистрация: 27.11.2011
Сообщений: 28
По умолчанию

Все, уже не надо) я ооочень сильно затупил(( все дело в статик...
noxior вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? ion leahu Помощь студентам 6 23.11.2014 19:36
А почему бы? ZuBy О форуме и сайтах клуба 6 16.09.2013 19:00
Существуют ли программы, показывающие все треды, находящиеся в винде и их id? Ibanez Wizard Софт 3 30.03.2011 18:21
Почему? С++ xitrec1zaraza Помощь студентам 5 15.03.2011 20:02