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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность 
V
    Опции темы
nornad
Дата 7.10.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Vasay @  8.10.2007,  00:43 Найти цитируемый пост)
Не жди от меня жалости - я препод

 smile  smile 
Цитата(Vasay @  8.10.2007,  00:43 Найти цитируемый пост)
и буду тбя носом в примеры тыкать

препода это могут smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Vasay
Дата 7.10.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



to Samotnik

возьми книжку, посмотри главу 11, посмотри пример в разделе использование синхронизированных методов (у меня стр 283), посмотри его, и скажи, что тебе в нем непонятно?


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
nornad
Дата 7.10.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



"Задумался Чапай..." smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Samotnik
Дата 7.10.2007, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Цитата(Vasay @  7.10.2007,  21:43 Найти цитируемый пост)
Не жди от меня жалости - я препод

Со стереотипами?  smile 

Цитата(Vasay @  7.10.2007,  22:06 Найти цитируемый пост)
(у меня стр 283

Блин, да  мне все понятно в этом примере!!!!!(2  nornad,  вот я сейчас не кричу, я вообще очень редко кричу  smile ) Я ведь писал, что Шилдта  smile  я прочитал ВСЕГО! Но неполучается у меня  smile  smile  smile  smile  smile  smile 
 
Vasay,  нет ну так не пойдет, давайте искать компромис, сегодня понедельник, а мне во вторник нуно проект здавать!!!  smile 

 smile  smile  smile  smile  smile  smile  smile  smile  smile 

Это сообщение отредактировал(а) Samotnik - 7.10.2007, 23:26
PM MAIL   Вверх
Vasay
Дата 7.10.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Vasay,  нет ну так не пойдет, давайте искать компромис, сегодня понедельник, а мне во вторник нуно проект здавать!!!  smile 


А как пойдет, чтоб тебе дали готовый код?

Этот пример легко превращается в то что тебе нужно...

Давай возьмем его и превратим в твою программ. (только не забудь посмотреть на следующую страницу, там написано что надо добавить в этот код, чтоб класс Callme стал синхронизированным)

Начнем с класса Synch - это твой Main

Впринципе, ты его почти написал:

сейчас проверю, чтоб работало, а ты пока запусти пример....


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Vasay
Дата 8.10.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну что, запустил, или спать ушел?


Видать ушел спать... Я тоже пойду...

Посмотри этот код:
Код

/*
 * Main.java
 *
 * Created on 7 Октябрь 2007 г., 21:03
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package samotnik;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

/**
 *
 * @author vasay
 */
class Callme {
   

    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    public static synchronized  String call(String msg, boolean ans) throws IOException {
        String out = "";
        
        System.out.println(msg);
        
        if(ans == true) {
            out = br.readLine();
        }
        
        return out;
    }
    
}

class Caller implements Runnable {
    
  //  String msg;
    String ThreadName;
    
    Thread t;
    
    private boolean KillMe = false;
        
    
    public Caller( String Name) {
        
       ThreadName = Name;
        
       
        t = new Thread(this);
        
        t.start();
        
    }
    
    void setKillMe(boolean KM)
    {
        KillMe = KM;
    }
    
    public void run() {
        try {
            for(int i = 0; i<10; i++)
            {
                Thread.sleep(1000);
                if(KillMe==true)
                {
                    Callme.call("ya potok "+ThreadName+", i ya sdelal "+i+" tsiclov. No na etom moya jizn' zakanchivaetsa. Poka!!! Najmite enter dldlya prodoljeniya",true);
                    break;
                }
                else
                {
                    Callme.call("ya potok "+ThreadName+", i ya sdelal "+i+" tsiclov. Najmite enter dldlya prodoljeniya",true);
            
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        
    } 
}


public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    public static void main(String[] args) {
        

        ArrayList  ThreadList = new ArrayList();
        String Ans = "";
        int count =0;
        
        try {
            do{
                Ans = Callme.call("Enter \"start\" - To start new thread, \"Exit\" - To exit, i chto libo drugoe drya prodoljeniya" ,true);
                if (Ans.equalsIgnoreCase("start")){
                    ThreadList.add(new Caller("Thread"+count));
                    count++;
                    //Thread.sleep(1000);
                }

            }while(!Ans.equalsIgnoreCase("Exit"));
            for (int i = 0; i < ThreadList.size();i++)
            {
                if(((Caller)ThreadList.get(i)).t.isAlive())
                {
                    ((Caller)ThreadList.get(i)).setKillMe(true);
                    ((Caller)ThreadList.get(i)).t.join();
                }
                
            }
            
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        
    }

}


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



Это сообщение отредактировал(а) Vasay - 8.10.2007, 01:40


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Samotnik
Дата 8.10.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Vasay,   smile   
Щас не могу, на пары нужно идти, вечером отпишусь!!!  smile 
PM MAIL   Вверх
alex_nevolin
Дата 8.10.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хочу тоже помочь smile 
1) Для начала сделай классы помощники чтения входных параметров. Что-то типа этого:
Код

class DirectoryReader {
    public static File read(BufferedReader br, String question)
        throws IOException {
        while (true) {
            System.out.println(question);
            File dir = new File(br.readLine());
            if (dir.exists() && dir.isDirectory())
                return dir;
            else
                System.out
                    .println("Not exist such directory, please try again");
        }
    }
}

Это избавит тебя от дублирования кода, позволит лучше контролировать код и ввод пользователя и сократит твой main.

2)Создай класс который будет заниматься непосредственно копированием, относледуй его от Thread и параметризуй. Типа так:
Код

class FileScaner extends Thread {

    private File inputDir;
    private File outputDir;
    private FilenameFilter filter;
    private boolean includeSubfolders;
    private boolean autoDelete;

    public FileScaner(
        File inputDir,
        File outputDir,
        FilenameFilter filter,
        boolean includeSubfolders,
        boolean autoDelete) {
        super();
        this.inputDir = inputDir;
        this.outputDir = outputDir;
        this.filter = filter;
        this.includeSubfolders = includeSubfolders;
        this.autoDelete = autoDelete;
    }
}

Так ты сможешь более удобно контролировать код и переписывать, его менять функциональность.

3)Создай в классе FileScaner методы рекурсивного обхода директорий и копирования файлов:
Код

private void copyDir(
        File inputDir,
        File outputDir,
        FilenameFilter filter,
        boolean includeSubfolders,
        boolean autoDelete) {
        File[] files = inputDir.listFiles(filter);
        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile())
                copyFile(files[i], new File(outputDir, files[i].getName()),
                    autoDelete);
            if (includeSubfolders && files[i].isDirectory()) {
                File dir = new File(outputDir, files[i].getName());
                dir.mkdir();
                copyDir(files[i], dir, filter, includeSubfolders, autoDelete);
                if (autoDelete)
                    files[i].delete();
            }
        }
    }

    private void copyFile(File inp, File out, boolean autoDelete) {
        try {
            FileChannel source = new FileInputStream(inp).getChannel();
            FileChannel destination = new FileOutputStream(out).getChannel();
            destination.transferFrom(source, 0, source.size());
            source.close();
            destination.close();
            if (autoDelete)
                inp.delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Это в дальнейшем облегчит тебе написание тестов (Junit).

4)Теперь все просто. вызови в run этого класса:
Код

//        System.out.println("The '" + Thread.currentThread().getName()
//            + "' start");
        copyDir(inputDir, outputDir, filter, includeSubfolders, autoDelete);
//        System.out.println("The '" + Thread.currentThread().getName()
//            + "' finish");


5) Осталось написать main:
Код

public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                System.in));
            int threadcounter = 1;
            while (true) {
                System.out.println("Scan - To scan");
                System.out.println("Exit - To exit");
                String command = br.readLine();
                if (command.equalsIgnoreCase("Scan")) {
                    File inputDir = DirectoryReader.read(br,
                        "Please enter scan - input directory");
                    File outputDir = DirectoryReader.read(br,
                        "Please enter - output directory");
                    FilenameFilter filter = MaskReader.read(br,
                        "Please enter mask");
                    boolean includeSubfolders = BooleanReader.read(br,
                        "Do you wish include subfolders? (true/false)");
                    boolean autoDelete = BooleanReader.read(br,
                        "Do you wish delete that file? (true/false)");
                    FileScaner scaner = new FileScaner(inputDir, outputDir,
                        filter, includeSubfolders, autoDelete);
                    scaner.setName("Thread " + threadcounter++);
                    scaner.start();
                } else if (command.equalsIgnoreCase("Exit")) {
                    System.out.println("Good Bye!! ");
                    break;
                } else {
                    System.out.println("Unknown command, please try again");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

PM MAIL   Вверх
Vasay
Дата 8.10.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



to alex_nevolin

Ну вот, теперь Samotnik просто возьмет твой код, получит 5, а как потоки работают, так и не разберется, подождал бы уж до вечера, пускай бы человек хоть в чем-то разобраться попробовал бы.


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Samotnik
Дата 8.10.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Цитата(Vasay @  8.10.2007,  16:02 Найти цитируемый пост)
 получит 5

почему 5 , мож я 10   хочу  smile 

Цитата(Vasay @  8.10.2007,  16:02 Найти цитируемый пост)
так и не разберется, подождал бы уж до вечера, пускай бы человек хоть в чем-то разобраться попробовал бы.

Буду разбираться!!  smile   Честное слово!!!

Пэ.эс.
Вобщем, если заработает, то как и обещал, всем кто мне помог  по +2  в "репу"   smile  
PM MAIL   Вверх
Samotnik
Дата 8.10.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



2 all
Я вот нифига не разобрался! То,что скинул alex_nevolin,  содержит 56 ошибок и ничего не понятно! Можно как нить на примере МОЕГО кода обьяснить! Оч надо!!
PM MAIL   Вверх
alex_nevolin
Дата 8.10.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ок. Давай попробуем.
Только проблема в том что у тебя все в одной куче. Давай говорить о конкретных классах которые будут реализовывать ту или иную функциональность в программе. Ну например давай вначале реализуем класс копирования директорий. Напишем его оттестируем, можно даже сразу написать тесты к нему.. это ведь тоже входит в задание?
PM MAIL   Вверх
nornad
Дата 8.10.2007, 18:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Samotnik @  8.10.2007,  19:46 Найти цитируемый пост)
всем кто мне помог  по +2  в "репу"

Извращенец smile
Цитата(alex_nevolin @  8.10.2007,  20:18 Найти цитируемый пост)
Ок. Давай попробуем.
Только проблема в том что у тебя все в одной куче.

Вот тут-то собака и порылась. Если ты ещё не понял, поясняю - надо вместо Samotnik'а всю эту кучу разложить по полочкам и дать готовый код, который можно скомпилировать, запустить и юзать. В общем, от чего мы с Vasay и пытались его отучить. smile

Добавлено через 2 минуты и 35 секунд
alex_nevolin, самое смешное, что решение уже описано раза три. Просто автор почему-то до сих пор не реализовал его. Учитывая, что решение достаточно элементарное, я больше склоняюсь к варианту с нежеланием самостоятельно подумать. Могу, конечно, и ошибаться; поэтому сразу прошу прощения у автора, если не прав - обижать не имею намерения.

Добавлено через 4 минуты и 18 секунд
Samotnik, на правах рекламы рекомендую в следующем "предложении писать" примерно так:
всем, кто поможет мне с решением - дам дважды в репу.
Куда веселее получается. smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
alex_nevolin
Дата 8.10.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну дак поэтому, я и не запостил готовый работающий пример. Всего лишь пытаюсь натолкнуть автора темы на правильные решения в разработке данной программы. Может конечно запостил сразу слишком много. Но разобраться думаю в моем ответе не сложно.
PM MAIL   Вверх
Vasay
Дата 8.10.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Вобщем, если заработает, то как и обещал, всем кто мне помог  по +2  в "репу"   smile   


Не, не подкупишь, готовый код все равно не дам  smile 

Цитата

Учитывая, что решение достаточно элементарное, я больше склоняюсь к варианту с нежеланием самостоятельно подумать.

Грустно...

to Samotnik, - ты мой код посмотрел (он компилется, проверял  smile )? Напиши мне, кудав там надо вставить работу сканера?


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


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

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