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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> wait(), notify() 
V
    Опции темы
kostay
Дата 18.11.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



есть 4 лесоруба которые рубят деревья и складывают брёвна на склад, каждый имеет рендомное коли4ество(0-9)
рисуются один большой квадрат типо склад, и 4 маленьких которые движутся к нему, всё с цифрой сверху. достигая надо 4тобы они остановились на 500 миллисек и брёвна выложил тот у кого их меньше, ну ето не важно, хотябы 4тобы они поо4ереди их выложили, тоесть каждый из потоков поо4ереди имел доступ к методу, вот основной код, вобшем пока не выложил не продолжает движение. ни4его не понимаю ((

Код

import java.util.*;

public class Logic {
    Display display; //панель в которой всё отображется
    LogHouse logHouse; 
    WoodCutter woodCutter; 
    ArrayList<WoodCutter> wclist = new ArrayList<WoodCutter>(); //лист с 4 лесорубами

    public Logic(Display display, LogHouse logHouse) {
        this.display = display;
        this.logHouse = logHouse;

        display.setLogHousePos(logHouse.getX(), logHouse.getY());
        
        //запускаем 4 штуки они идут к нарисованному квадрату (logHouse)
        new WoodCutterThread(1).start();
        new WoodCutterThread(2).start();
        new WoodCutterThread(3).start();
        new WoodCutterThread(4).start();

        display.setWoodCutters(wclist);
    }

    class WoodCutterThread extends Thread {
        int i;

        public WoodCutterThread(int i){
            this.i = i;
            woodCutter = new WoodCutter(i);
            wclist.add(woodCutter);
        }

        public void run() {
            wclist.get(i-1);
            while(true){
                wclist.get(i-1).moveRight(); //движемся вправо
                if(wclist.get(i-1).getX() == logHouse.getX()-20){ //пока не достигнем координат логхауса
                    logHouse.placeLogs(wclist.get(i - 1).takeLogs()); //и тогда выкладываем туда то 4то несём, етот метод синхронизирован
                }
                display.setLogHousePieceCount(String.valueOf(logHouse.getLogCount())); //показываем сколько в хранилише
                display.refresh(); 
                try {
                    sleep(10);
                } catch (Exception e) {}
            }
        }
    }


отрывок из другова класса
}
Код

public synchronized void placeLogs(int logCount){

        while(hasPieces == 0){
            try { //вобшем 4то сюда писать?
                wait();
                Thread.sleep(500);
                hasPieces = logCount;
                notifyAll();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

PM MAIL   Вверх
kostay
Дата 18.11.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



4то никто не знает 4то мне записать в synchronized метод, 4тобы потоки поо4ереди или по определённому условию пользовали его? помоему ето просто, но сколько не пытался ни4его не выходило... умаляю помо4 о4ень надо.
PM MAIL   Вверх
Aristotelb
Дата 18.11.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



так?
Код

public synchronized void placeLogs(int logCount){        
                hasPieces = logCount;        
}


зачем там цикл while(hasPieces == 0) ?- зацикливание произойдет же

можно выложить упрощенный запускаемый пример?
PM MAIL ICQ   Вверх
kostay
Дата 18.11.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



более упрошонно на словах: есть синхронизироваанный метод(монитор) к которому одновременно обрашается несколько потоков, надо 4тобы только один из них имел доступ остальные ждали, тот кто выполнил дейсвие продолжает свои другие дела, потом следуший и так далее...

вот все коды

Код

import java.awt.*;
import javax.swing.*;

public class Application extends JFrame {
    private Display display = new Display();
    LogHouse logHouse = new LogHouse();
    private Logic controller = new Logic(display, logHouse);

    public Application() {
        getContentPane().add(display);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
    }
    public static void main(String[] args) {
        new Application();
    }
}


Код

import java.awt.*;
import javax.swing.*;
import java.util.*;

public class Display extends JPanel {
    private int lhx, lhy;
    private String lhs;
    private ArrayList<WoodCutter> wclist = new ArrayList<WoodCutter>();

  public Display() {
      this.setPreferredSize(new Dimension(500, 350));
      setBackground(Color.white);
  }

  public void setWoodCutters(ArrayList wclist) {
      this.wclist = wclist;
  }

  public void refresh(){
      repaint();
  }

  public void setLogHousePos(int x, int y){
      this.lhx = x;
      this.lhy = y;
  }

  public void setLogHousePieceCount(String s){
      this.lhs = s;
  }

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    //woodcutters
    for(int i=0; i<wclist.size(); i++){
        g.setColor(Color.red);
        g.drawRect(wclist.get(i).getX(), wclist.get(i).getY(), 20, 20);
        g.drawString(String.valueOf(wclist.get(i).showLogs()), wclist.get(i).getX(), wclist.get(i).getY());
    }
    //loghouse
    g.setColor(Color.black);
    g.drawRect(lhx, lhy, 100, 100);
    g.drawString(lhs, lhx, lhy);
  }

}


Код

import java.awt.Point;

public class LogHouse {
    private final int capacity = 30;
    private int hasPieces;
    private Point displacement;

    public LogHouse() {
        hasPieces = 0;
        displacement = new Point(200, 70);
    }

    public synchronized void placeLogs(int logCount){

        System.out.println(Thread.currentThread().getName());
        while(hasPieces == 0){
            try {
                while(hasPieces == 0)
                wait();
                Thread.sleep(500);
                hasPieces = logCount;
                System.out.println("placeLogs "+hasPieces);
                notifyAll();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }


    }

    public int getLogs(int logCount) {
        hasPieces -= logCount;
        return logCount;
    }

    public int getLogCount() {
        return hasPieces;
    }

    public int getX() {
        return displacement.x;
    }

    public int getY() {
        return displacement.y;
    }
}


Код

import java.util.*;

public class Logic {
    Display display;
    LogHouse logHouse;
    WoodCutter woodCutter;
    ArrayList<WoodCutter> wclist = new ArrayList<WoodCutter>();

    public Logic(Display display, LogHouse logHouse) {
        this.display = display;
        this.logHouse = logHouse;

        display.setLogHousePos(logHouse.getX(), logHouse.getY());

        new WoodCutterThread(1).start();
        new WoodCutterThread(2).start();
        new WoodCutterThread(3).start();
        new WoodCutterThread(4).start();

        display.setWoodCutters(wclist);
    }

    class WoodCutterThread extends Thread {
        int i;

        public WoodCutterThread(int i){
            this.i = i;
            woodCutter = new WoodCutter(i);
            wclist.add(woodCutter);
        }

        public void run() {
            wclist.get(i-1);
            while(true){
                wclist.get(i-1).moveRight();
                if(wclist.get(i-1).getX() == logHouse.getX()-20){
                    logHouse.placeLogs(wclist.get(i - 1).takeLogs());
                }
                display.setLogHousePieceCount(String.valueOf(logHouse.getLogCount()));
                display.refresh();
                try {
                    sleep(10);
                } catch (Exception e) {}
            }
        }
    }
}


Код

import java.awt.*;
import java.util.*;

public class WoodCutter {
    private int hasPieces = 0;
    private Point displacement;

    public WoodCutter(int number) {
        switch(number){
        case 1:
            displacement = new Point(50, 60);
            hasPieces = new Random().nextInt(10);
            break;
        case 2:
            displacement = new Point(50, 100);
            hasPieces = new Random().nextInt(10);
            break;
        case 3:
            displacement = new Point(50, 140);
            hasPieces = new Random().nextInt(10);
            break;
        case 4:
            displacement = new Point(50, 180);
            hasPieces = new Random().nextInt(10);
            break;
        }
    }

    public void moveRight() {
        displacement.x++;
    }

    public void moveLeft() {
        displacement.x--;
    }

    public void moveUp() {
        displacement.y--;
    }

    public void moveDown() {
        displacement.y++;
    }

    public int takeLogs(){
        int i = hasPieces;
        hasPieces = 0;
        return i;
    }

    public int showLogs(){
        return hasPieces;
    }

    public int getX() {
        return displacement.x;
    }

    public int getY() {
        return displacement.y;
    }

}

PM MAIL   Вверх
Aristotelb
Дата 18.11.2007, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сорри что одним файлом
оно?
Код

/*
 * Main.java
 *
 * Created on 18 Ноябрь 2007 г., 22:49
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package javaapplication8;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame {
    private Display display = new Display();
    LogHouse logHouse = new LogHouse();
    private Logic controller = new Logic(display, logHouse);

    public Main() {
        getContentPane().add(display);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
    }
    public static void main(String[] args) {
        new Main();
    }
}

class Display extends JPanel {
    private int lhx, lhy;
    private String lhs;
    private ArrayList<WoodCutter> wclist = new ArrayList<WoodCutter>();

  public Display() {
      this.setPreferredSize(new Dimension(500, 350));
      setBackground(Color.white);
  }

  public void setWoodCutters(ArrayList wclist) {
      this.wclist = wclist;
  }

  public void refresh(){
      repaint();
  }

  public void setLogHousePos(int x, int y){
      this.lhx = x;
      this.lhy = y;
  }

  public void setLogHousePieceCount(String s){
      this.lhs = s;
  }

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    //woodcutters
    for(int i=0; i<wclist.size(); i++){
        g.setColor(Color.red);
        g.drawRect(wclist.get(i).getX(), wclist.get(i).getY(), 20, 20);
        g.drawString(String.valueOf(wclist.get(i).showLogs()), wclist.get(i).getX(), wclist.get(i).getY());
    }
    //loghouse
    g.setColor(Color.black);
    g.drawRect(lhx, lhy, 100, 100);
    g.drawString(lhs, lhx, lhy);
  }

}

class LogHouse {
    private final int capacity = 30;
    private int hasPieces;
    private Point displacement;

    public LogHouse() {
        hasPieces = 0;
        displacement = new Point(200, 70);
    }

//    public synchronized void placeLogs(int logCount){
//
//        System.out.println(Thread.currentThread().getName());
//        while(hasPieces == 0){
//            try {
//                while(hasPieces == 0)
////                wait();
//                Thread.sleep(1500);
//                hasPieces = logCount;
//                System.out.println("placeLogs "+hasPieces);
////                notifyAll();
//
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }

 public synchronized void placeLogs(int logCount){
         System.out.println(Thread.currentThread().getName());
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
         
         hasPieces = logCount;
         
}

    public int getLogs(int logCount) {
        hasPieces -= logCount;
        return logCount;
    }

    public int getLogCount() {
        return hasPieces;
    }

    public int getX() {
        return displacement.x;
    }

    public int getY() {
        return displacement.y;
    }
}

class Logic {
    Display display;
    LogHouse logHouse;
    WoodCutter woodCutter;
    ArrayList<WoodCutter> wclist = new ArrayList<WoodCutter>();

    public Logic(Display display, LogHouse logHouse) {
        this.display = display;
        this.logHouse = logHouse;

        display.setLogHousePos(logHouse.getX(), logHouse.getY());
        try{
            
            new WoodCutterThread(1).start();
                Thread.sleep(300);
            new WoodCutterThread(2).start();
                Thread.sleep(300);
            new WoodCutterThread(3).start();
                Thread.sleep(300);
            new WoodCutterThread(4).start();
            
        }catch(InterruptedException ie){
            ie.printStackTrace();
        }
        display.setWoodCutters(wclist);
    }

 class WoodCutterThread extends Thread {
        int i;

        public WoodCutterThread(int i){
            this.i = i;
            woodCutter = new WoodCutter(i);
            wclist.add(woodCutter);
        }

        public void run() {
            wclist.get(i-1);
            while(true){
                wclist.get(i-1).moveRight();
                if(wclist.get(i-1).getX() == logHouse.getX()-20){
                                        
                        logHouse.placeLogs(wclist.get(i - 1).takeLogs());                    
                    
                }
                display.setLogHousePieceCount(String.valueOf(logHouse.getLogCount()));
                display.refresh();
                try {
                    sleep(20);
                } catch (Exception e) {}
            }
        }
    }
}

class WoodCutter {
    private int hasPieces = 0;
    private Point displacement;

    public WoodCutter(int number) {
        switch(number){
        case 1:
            displacement = new Point(50, 60);
            hasPieces = new Random().nextInt(10);
            break;
        case 2:
            displacement = new Point(50, 100);
            hasPieces = new Random().nextInt(10);
            break;
        case 3:
            displacement = new Point(50, 140);
            hasPieces = new Random().nextInt(10);
            break;
        case 4:
            displacement = new Point(50, 180);
            hasPieces = new Random().nextInt(10);
            break;
        }
    }

    public void moveRight() {
        displacement.x++;
    }

    public void moveLeft() {
        displacement.x--;
    }

    public void moveUp() {
        displacement.y--;
    }

    public void moveDown() {
        displacement.y++;
    }

    public int takeLogs(){
        int i = hasPieces;
        hasPieces = 0;
        return i;
    }

    public int showLogs(){
        return hasPieces;
    }

    public int getX() {
        return displacement.x;
    }

    public int getY() {
        return displacement.y;
    }

}


для наглядности добавил раздельный старт

Это сообщение отредактировал(а) Aristotelb - 18.11.2007, 23:27
PM MAIL ICQ   Вверх
kostay
Дата 19.11.2007, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



116: hasPieces += logCount; моя ошибка

ага работает так как нужно, я думал wait() заставляет их ждать а notify() действовать, 4то тут вобше полу4ается можеш пояснить? они всёже одновременно имеют доступ или в какой о4ерёдности?
да и как тут поставить 4тоб цифра над красным квадратом менялась только когда поменялось зна4ение 4орного квадрата? по4емуто обнуляются 4 сразу а большой квадрат постепенно хотя: logHouse.placeLogs(wclist.get(i - 1).takeLogs());

Добавлено через 4 минуты и 35 секунд
а нас4от последнего дошло: видимо то 4то в скопках выполняют все сразу только потом они ставят ето в другой метод который заставляет ждать, видимо придётся переделать: отдавать и обнулять отдельные методы

Добавлено через 8 минут и 55 секунд
и последнее, куда сдесь можно былоб записать какое-либо условие, к примеру 4тобы о4ерёднось была такая 4то первый выкладывает тот кто имеет больше остальных...
PM MAIL   Вверх
Aristotelb
Дата 19.11.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у одного и того же объекта разные потоки не могут вызвать synchronized  метод одновременно.
подробно читай здесь

Это сообщение отредактировал(а) Aristotelb - 19.11.2007, 18:19
PM MAIL ICQ   Вверх
Aristotelb
Дата 19.11.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вобщем так: написано жутко криво но луче ничего не придумал
Код

/*
 * Main.java
 *
 * Created on 18 Ноябрь 2007 г., 22:49
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package javaapplication8;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame {
    private Display display = new Display();
    LogHouse logHouse = new LogHouse();
    private Logic controller = new Logic(display, logHouse);
    
    public Main() {
        getContentPane().add(display);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
    }
    public static void main(String[] args) {
        new Main();
    }
}

class Display extends JPanel {
    private int lhx, lhy;
    private String lhs;
    private ArrayList<WoodCutter> wclist = new ArrayList<WoodCutter>();
    
    public Display() {
        this.setPreferredSize(new Dimension(500, 350));
        setBackground(Color.white);
    }
    
    public void setWoodCutters(ArrayList wclist) {
        this.wclist = wclist;
    }
    
    public void refresh(){
        repaint();
    }
    
    public void setLogHousePos(int x, int y){
        this.lhx = x;
        this.lhy = y;
    }
    
    public void setLogHousePieceCount(String s){
        this.lhs = s;
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //woodcutters
        for(int i=0; i<wclist.size(); i++){
            g.setColor(Color.red);
            g.drawRect(wclist.get(i).getX(), wclist.get(i).getY(), 20, 20);
            g.drawString(String.valueOf(wclist.get(i).showLogs()), wclist.get(i).getX(), wclist.get(i).getY());
        }
        //loghouse
        g.setColor(Color.black);
        g.drawRect(lhx, lhy, 100, 100);
        g.drawString(lhs, lhx, lhy);
    }
    
}

class LogHouse {
    private final int capacity = 30;
    private int hasPieces;
    private Point displacement;
    
    public LogHouse() {
        hasPieces = 0;
        displacement = new Point(200, 70);
    }
    
//    public synchronized void placeLogs(int logCount){
//
//        System.out.println(Thread.currentThread().getName());
//        while(hasPieces == 0){
//            try {
//                while(hasPieces == 0)
////                wait();
//                Thread.sleep(1500);
//                hasPieces = logCount;
//                System.out.println("placeLogs "+hasPieces);
////                notifyAll();
//
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
    
    public void placeLogs(int logCount){
        System.out.println(Thread.currentThread().getName());
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        
        hasPieces += logCount;
        
    }
    
    public int getLogs(int logCount) {
        hasPieces -= logCount;
        return logCount;
    }
    
    public int getLogCount() {
        return hasPieces;
    }
    
    public int getX() {
        return displacement.x;
    }
    
    public int getY() {
        return displacement.y;
    }
}

class Logic {
    Display display;
    LogHouse logHouse;
    ArrayList<WoodCutter> wclist = new ArrayList<WoodCutter>();
    
    LinkedList sortedwc = new LinkedList();
    
    static Object sync = new Object();
    
    public Logic(Display display, LogHouse logHouse) {
        this.display = display;
        this.logHouse = logHouse;
        
        display.setLogHousePos(logHouse.getX(), logHouse.getY());
        
        Thread wc1 = new WoodCutterThread(1);
        Thread wc2 = new WoodCutterThread(2);
        Thread wc3 = new WoodCutterThread(3);
        Thread wc4 = new WoodCutterThread(4);
        
        
        wc1.setName("wc1");
        wc2.setName("wc2");
        wc3.setName("wc3");
        wc4.setName("wc4");
        
        sortedwc.addAll(wclist);
        
        Thread[] ts = {wc1,wc2,wc3,wc4};
        for(Thread t : ts){t.start();} //стартуем все потоки
        
        display.setWoodCutters(wclist);
    }
    
    class WoodCutterThread extends Thread {
        int i;
        
        WoodCutter woodCutter; //ИМХО здесь ему место
        
        public WoodCutterThread(int i){
            this.i = i;
            woodCutter = new WoodCutter(i);
            wclist.add(woodCutter);
        }
        
        public void run() {
            wclist.get(i-1);
            while(true){
                wclist.get(i-1).moveRight();
                if(wclist.get(i-1).getX() == logHouse.getX()-20){
                    
                    while(!lock()); 
                    
                    logHouse.placeLogs(wclist.get(i - 1).takeLogs());
                    
                }
                display.setLogHousePieceCount(String.valueOf(logHouse.getLogCount()));
                display.refresh();
                try {
                    sleep(20);
                } catch (Exception e) {}
            }
        }
        
        private boolean lock(){
            
            synchronized (sortedwc){ // Синхронезируемся на коллекции
                
                WoodCutter max = (WoodCutter) Collections.max(sortedwc); 
                
                if(max.equals(woodCutter)){ //если текущий wc максимален удаляем его и возвращаем true
                    sortedwc.remove(max);   //т.о максимальный wc первым выложит логи
                    
                    System.out.println("max "+i+" "+max.showLogs());
                    
                    return true; 
                }
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            return false;
        }
        
    }
    
}

class WoodCutter implements Comparable<WoodCutter>{
    private int hasPieces = 0;
    private Point displacement;
    
    public WoodCutter(int number) {
        switch(number){
            case 1:
                displacement = new Point(50, 60);
                hasPieces = new Random().nextInt(10);
                break;
            case 2: 
                displacement = new Point(50, 100);
                hasPieces = new Random().nextInt(10);
                break;
            case 3:
                displacement = new Point(50, 140);
                hasPieces = new Random().nextInt(10);
                break;
            case 4:
                displacement = new Point(50, 180);
                hasPieces = new Random().nextInt(10);
                break;
        }
    }
    
    public void moveRight() {
        displacement.x++;
    }
    
    public void moveLeft() {
        displacement.x--;
    }
    
    public void moveUp() {
        displacement.y--;
    }
    
    public void moveDown() {
        displacement.y++;
    }
    
    public int takeLogs(){
        int i = hasPieces;
        hasPieces = 0;
        return i;
    }
    
    public int showLogs(){
        return hasPieces;
    }
    
    public int getX() {
        return displacement.x;
    }
    
    public int getY() {
        return displacement.y;
    }
    
    public int compareTo(WoodCutter o) {
        return hasPieces == o.hasPieces ? 0 : hasPieces < o.hasPieces ? -1 : 1;
    }
    
}

PM MAIL ICQ   Вверх
kostay
Дата 20.11.2007, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Aristotelb @ 19.11.2007,  18:18)
у одного и того же объекта разные потоки не могут вызвать synchronized  метод одновременно.
подробно читай здесь

ну ето понятно, я вот только думал, 4то доступ организовывается с помошью wait и notify, оказывается они слу4айным образом кто успел тот и попал, тогда никак не могу вьехать за4ем методы 4то я назвал...
PM MAIL   Вверх
Aristotelb
Дата 20.11.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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