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

Поиск:

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


Новичок



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

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



Столкнулся с проблемой синхронизации в java, с помощью synchronized(). Не удается синхронизировать потоки в двух кодах.  
Первый - есть два потока, созданные разными способами. Один - генерирует рандомное число и пишет в буфер. Второй поток - пишет Hello столько раз - какое число сгенерировал первый. Код:
Код

import java.util.Random;
public class NewThread
{
public int Buff = -1;
public boolean state = true;
public boolean stop = false;
public Object lock = new Object();

    public class ThreadOne implements Runnable 
    {
        
        Thread t;
        
        ThreadOne()
        {
            t = new Thread(this, "ThreadOne");
            System.out.println("ThreadOne" + t);
            t.start();
        }
        
        @Override
        public void run() 
        {
            // TODO Auto-generated method stub
            int a = 10;
            while(a > 0)
            {
                System.out.println("000000000");
                synchronized(lock)
                {
                    if (Buff != -1)
                    {
                        System.out.println("11111111");
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                        System.out.println("22222222");
                    
                    //if(state)
                    //{
                        Random r = new Random();
                        Buff = r.nextInt(9);
                        a--;
                        //state = !state;
                    //}
                    lock.notifyAll();
                }
            }
        }
        
    }//end ThreadOne
    
    public class ThreadTwo extends Thread 
    {
        
        ThreadTwo()
        {
            super("ThreadTwo");
            System.out.println("ThreadTwo" + this);
            start();
        }
        public void run() 
        {
            int a = 10;
            while(a > 0)
            {
                synchronized(lock)
                {
                    System.out.println("33333333");
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                    System.out.println("44444444");
                    //if(!state)
                    //{
                        for(int i = 0; i < Buff; i++)
                            System.out.println("Hello " + Buff);
                        System.out.println("-------");
                        a--;
                        //state = !state;
                    //}
                    lock.notifyAll();
                    System.out.println("55555555");
                }                
            }
        }
    }
    public static void main(String[] args) 
    {
        NewThread nt = new NewThread();
        Runnable tt = nt.new ThreadTwo();
        Runnable to = nt.new ThreadOne();
        
    }
}




Во втором задание вводятся две переменные. Первая - кол-во потоков. Вторая - число, которое мы будем уменьшать. Надо запустить несколько потоков, которые будут уменьшать это число и выводить его не экран.
Код


public class Thread1 
{
    public int a, b, num;
    public boolean start = false;
    
    public Object lock = new Object();
    /**
     * @param args
     */
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Thread1 t = new Thread1();
        t.num = 1;
        
        t.a = t.b = Integer.parseInt(args[1]);
        for (int i = 0; i < Integer.parseInt(args[0]); i++)
        {
            Runnable nt = t.new Threads();
            Thread n = new Thread(nt);
            n.start();
        }
        
        
    t.start = true;

    }
    
    public class Threads implements Runnable
    {
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            int number = ++num;
            while(start) 
            
            while(true)
            {
                //System.out.println("1111111");
                synchronized(lock)
                {
                    if((a != b) && (number != 1))
                    {
                        try 
                        {
                            //System.out.println("222222");
                            lock.wait();
                        } 
                        catch (InterruptedException e) 
                        {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    if(a == 0)
                        break;
                    a--;
                    System.out.println(Integer.toString(number) + " " + Integer.toString(a));
                    lock.notifyAll();
                    
                }
                
            }
            
        }
    }
}



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16





--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
batex
Дата 9.9.2011, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



разобрался сам. Тему можно закрывать
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.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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