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

Поиск:

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


Super star !
****


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

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



Добрый день!
Есть код, сканер Директорий 
Значит, после запуска программы, ползователю предлагается 2 выбора: просканировать и выйти.  Стоит условие:
Цитата

Где после запуска выводится приглашение для ввода команд. В нашем случае мы имеем две команды: scan и exit. Где scan запускает сканер в отдельном потоке с заданными параметрами. И exit корректно останавливает работу всех запущенных сканеров и завершает работу программы.
 
Вот тут то и проблемка, я не могу сообразить, как многопоточность сделать?!? 
Вот фрагмент кода:
Код

String p;
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            while (true){
            System.out.println("Scan - To scan");
    System.out.println("Exit - To exit");
            p = br.readLine();
        
            if (p.equalsIgnoreCase("Scan")){
                BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Please enter scan -input"); 
//.........................
//Вот тут пошол выполняться код если пользователь выберет Scan: сканировать, копировать, удалять и т.д.
//  ................
// А вот это код если пользователь введет exit, но как вы видете он не корректный, а нужно сделать корректное завершение!! 
 if (p.equalsIgnoreCase("Exit")){
                System.out.println("Good Bye!! ");
                System.exit(0);
            }

Помогите плз приклееть многопоточность на Scan и exit  у меня ничего не получилось.  smile   smile    smile  smile    smile 
Пэ.Эс.
Желательно на примере моего кода, что бы легче разбираться было, т.к. во вторник уже сдавать это задание необходимо!!!
PM MAIL   Вверх
nornad
Дата 7.10.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Э... а ты вообще про многопоточность только слышал или хотя бы раз сам делал? Что-то мне кажется, что только слышал.
В общем, на форуме об этом уже куча всего есть и потому повторять лишний раз не стану (используй поле "Поиск", чай не первый день на форуме).
Скажу только, что тебе надо создать свой поток (Thread), в котором определить метод run.


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


Super star !
****


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

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



Цитата(nornad @  7.10.2007,  15:14 Найти цитируемый пост)
используй поле "Поиск"

Ничего полезного  smile 

Цитата(nornad @  7.10.2007,  15:14 Найти цитируемый пост)
Э... а ты вообще про многопоточность только слышал или хотя бы раз сам делал?

Делал сам, но только запуск элементарных приложени(распечатка цифр каждые 3 секунды,.. )
А вот сейчас по серьезнее нуна сделать, пробую пробую, но ..... smile 

Цитата(nornad @  7.10.2007,  15:14 Найти цитируемый пост)
Скажу только, что тебе надо создать свой поток (Thread), в котором определить метод run.

Так а что мне писать в методе run() ?  Ведь он должен быть реализован в классе, котором создается поток. А весь код у меня написан в   main() а в нем run() не напишешь. 

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


Super star !
****


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

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



 smile 
Ребята, помогите плз сделать потоки для каждого сканера !!!
С меня 2 плюса, кто поможет!! 
На самом деле, срочно нужно, во вторник уже сдавать, а  мне еще junit повставлять нуна!!!
 smile  smile  smile 
PM MAIL   Вверх
Vasay
Дата 7.10.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Многопоточность в java - это просто.

Давай так:
Цитата

Так а что мне писать в методе run() ?  Ведь он должен быть реализован в классе, котором создается поток. А весь код у меня написан в   main() а в нем run() не напишешь. 


Вынеси код, отвечающий за сканер в отдельный класс (пока без многопоточности) и запости код сюда....


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


Super star !
****


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

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



Цитата(Vasay @  7.10.2007,  17:35 Найти цитируемый пост)
Вынеси код, отвечающий за сканер в отдельный класс

Так мне придется весь код выносить, т.к. у меня все реализованно в  main()

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


Эксперт
****


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

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



Цитата(Samotnik @ 7.10.2007,  17:48)
Цитата(Vasay @  7.10.2007,  17:35 Найти цитируемый пост)
Вынеси код, отвечающий за сканер в отдельный класс

Так мне придется весь код выносить, т.к. у меня все реализованно в  main()

Так вынеси.... Зачем тебе код в main?


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


Super star !
****


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

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



 smile 
Готово!
Код

import java.io.*;
import java.nio.channels.*;
import org.apache.commons.io.*;

 class NewThread  {
            String inputDir = "";
            String ouputDir = "";
            String mask = "";
            String p = "";
            String includeSubfolders = "";
            String autoDelete = "";
           
          public void MainFunction() throws Exception{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Scan - To scan");
        System.out.println("Exit - To exit");
            p = br.readLine();
//************************************************************************            
            if (p.equalsIgnoreCase("Scan")){
                BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Please enter scan -input");   
                inputDir = input.readLine();
                File f1 = new File(inputDir);
                if (f1.isDirectory()){
                System.out.println("     Your way  is  " + f1.getAbsolutePath());   
                }
                else{
                    System.out.println("Not exist such directory");
                }
//***************************************************************************************
                BufferedReader output = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Please enter - output  directory");
                ouputDir = output.readLine();
                File f2 = new File(ouputDir);
                if (f2.isDirectory()){
                System.out.println("     Your way  is  " + f1.getAbsolutePath());   
                              }
                else{
                    System.out.println("Not exist such directory");
                }
            
//*************************************************************************************
                 String s[] = f1.list();
                 System.out.println("     You have in that directory:");
                 for(int i=0;i<s.length;i++){
                 System.out.println("                    " + s[i]);}
                 BufferedReader maskvvoda = new BufferedReader(new InputStreamReader(System.in)); 
                 System.out.println("Please enter mask");
                 mask = maskvvoda.readLine();
                 String str1 = inputDir+mask;
                 String str2 = ouputDir+mask;
                 System.out.println(str1 + "  qwerqwerwer  " + str2);
                   
              BufferedReader includeSubf = new BufferedReader(new InputStreamReader(System.in));
              System.out.println("Do you wish include subfolders ? (true/false)");   
              includeSubfolders = includeSubf.readLine();
              if(includeSubfolders.equalsIgnoreCase("false")){
                                                
        try {
       FileChannel source = new FileInputStream(str1).getChannel();
       FileChannel destination = new FileOutputStream(str2).getChannel();
   
       destination.transferFrom(source, 0, source.size());
   
       source.close();
       destination.close();
   } catch (IOException e) {
   }
              }
              else if(includeSubfolders.equalsIgnoreCase("true")){
                  try {
                      
       } catch (Exception e) {
   }                  
              }
                   
//************************************************************************************
              BufferedReader deleteAuto = new BufferedReader(new InputStreamReader(System.in));
              System.out.println("                Do you wish delete that file ?   (true/false)");   
              autoDelete = deleteAuto.readLine();
              if(autoDelete.equalsIgnoreCase("true")){
                  File FDelete = new File(str1);  
                  FDelete.delete();
              }
                 
//*************************************************************************************            
            }
              if (p.equalsIgnoreCase("Exit")){
                System.out.println("Good Bye!! ");
                System.exit(0);
               /* if (Thread.isInterrupted()) {
                throw new InterruptedException();*/
}
           }
    }
public class Main {
          public static void main(String[] args) {
                        NewThread obj = new NewThread();
                        while(true){
                            try{
                        obj.MainFunction();}
                            catch(Exception e){
                                System.out.println("Warning" + e);
                            }
                        }
                        
      }
}



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


Эксперт
***


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

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



Цитата(Samotnik @  7.10.2007,  20:27 Найти цитируемый пост)
С меня 2 плюса

Ну, ежели только за ради славы... smile

Цитата(Samotnik @  7.10.2007,  19:01 Найти цитируемый пост)
Так а что мне писать в методе run() ?

В нём и надо запускать сканер. Я бы рекомендовал выделить сканер в отдельный класс, который будет создаваться и запускаться в потоке.
Точнее, даже не так - пусть твой сканер и будет потоком. smile
В общем, делаешь класс сканера, наследуешь его от Thread и определяешь метод run.
Если вообще создавал поток, то проблем быть не должно. На форуме, повторюсь, есть масса примеров работы с потоками. Видимо, ты плохо искал.

Цитата(Samotnik @  7.10.2007,  20:48 Найти цитируемый пост)
Так мне придется весь код выносить

Сомневаюсь. У тебя же ещё должен быть реализован опрос консоли, чтобы пользователь мог вводить команды. Его, кстати, можно сделать в бесконечном цикле в основном потоке. Или выделить в отдельный поток, но это, имхо, хуже - зачем плодить лишние потоки?

Цитата(Samotnik @  7.10.2007,  20:57 Найти цитируемый пост)
Готово!

Цитата(Samotnik @  7.10.2007,  20:57 Найти цитируемый пост)
 class NewThread  {

Не похоже. А где наследование от трэда? Давай не будем делать откровенно глупые вещи. Тебе советовали выделить код сканера в отдельный класс. Это ты выделил. Теперь чтобы сделать из этого поток, осталось лишь унаследовать и определить ран. "Чего же боле?".


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


Эксперт
****


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

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



Несовсем так. Я хотел чтобы ты вынес в отдельный класс все что отвечает за сам сканер,
т.е. то что между 

if (p.equalsIgnoreCase("Scan")){  
************************
}


т.е. то что будет работать в отдельном потоке.




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


Super star !
****


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

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



Vasay,   А так пойдет   ?  :
Код

import java.io.*;
import java.nio.channels.*;
import org.apache.commons.io.*;

 class NewThread implements Runnable {
            String inputDir = "";
            String ouputDir = "";
            String mask = "";
            String includeSubfolders = "";
            String autoDelete = "";
            
     void MainFunction() throws Exception{
         BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Please enter scan -input");   
                inputDir = input.readLine();
                File f1 = new File(inputDir);
                if (f1.isDirectory()){
                System.out.println("     Your way  is  " + f1.getAbsolutePath());   
                }
                else{
                    System.out.println("Not exist such directory");
                }
//***************************************************************************************
                BufferedReader output = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Please enter - output  directory");
                ouputDir = output.readLine();
                File f2 = new File(ouputDir);
                if (f2.isDirectory()){
                System.out.println("     Your way  is  " + f1.getAbsolutePath());   
                              }
                else{
                    System.out.println("Not exist such directory");
                }
            
//*************************************************************************************
                 String s[] = f1.list();
                 System.out.println("     You have in that directory:");
                 for(int i=0;i<s.length;i++){
                 System.out.println("                    " + s[i]);}
                 BufferedReader maskvvoda = new BufferedReader(new InputStreamReader(System.in)); 
                 System.out.println("Please enter mask");
                 mask = maskvvoda.readLine();
                 String str1 = inputDir+mask;
                 String str2 = ouputDir+mask;
                 System.out.println(str1 + "  qwerqwerwer  " + str2);
                   
              BufferedReader includeSubf = new BufferedReader(new InputStreamReader(System.in));
              System.out.println("Do you wish include subfolders ? (true/false)");   
              includeSubfolders = includeSubf.readLine();
              if(includeSubfolders.equalsIgnoreCase("false")){
                                                
        try {
       FileChannel source = new FileInputStream(str1).getChannel();
       FileChannel destination = new FileOutputStream(str2).getChannel();
   
       destination.transferFrom(source, 0, source.size());
   
       source.close();
       destination.close();
   } catch (IOException e) {
   }
              }
              else if(includeSubfolders.equalsIgnoreCase("true")){
                  try {
                      File ffu1 = new File(inputDir);
                      File ffu2 = new File(ouputDir);
                      
                      FileUtils fu = new FileUtils();
                      fu.copyDirectoryToDirectory(ffu1,ffu2);
                      
       } catch (Exception e) {
   }                  
              }
                   
//************************************************************************************
              BufferedReader deleteAuto = new BufferedReader(new InputStreamReader(System.in));
              System.out.println("                Do you wish delete that file ?   (true/false)");   
              autoDelete = deleteAuto.readLine();
              if(autoDelete.equalsIgnoreCase("true")){
                  File FDelete = new File(str1);  
                  FDelete.delete();
              }         
     }
           
     void ExitFunctions(){
         System.exit(0);
     }
   }
public class Main {
          public static void main(String[] args) throws Exception{
             String p = "";
             NewThread obj = new NewThread();
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             while(true){
             System.out.println("Scan - To scan");
         System.out.println("Exit - To exit");
             p = br.readLine();
         
            if (p.equalsIgnoreCase("Scan")){
                 obj.MainFunction();
            }
              if (p.equalsIgnoreCase("Exit")){
              obj.ExitFunctions();
}
             }
           }   
}     

nornad, пожалуйста скажи номер строки, где следует писать  ран ?

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


Эксперт
****


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

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



Не не пойдет.... Добавил Почти пойдет...

Итак, давай по порядку, как это должно работать (пока без потока):

Класс main:

Что логически там должно произойти?

Запуск программы ->Вывод сообщения (введите "scan" для сканирования, "Exit" для выхода) -> читаем ввод пользователя ->
Если "Exit" -> вышли

Если "Scan"-> (Пока) создали объект класса NewThread -> Запустили MainFunction(); ->MainFunction()  отработала -> (это на будущее) попросили пользователя ввести "Stop", если  верно, то вышли, нет, просим еще раз

Сделай пока это, тебе немного поменять (пока без потоков)

Это сообщение отредактировал(а) Vasay - 7.10.2007, 20:33


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


Super star !
****


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

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



Чет я вот с этим не сильно понял

Цитата(Vasay @  7.10.2007,  20:27 Найти цитируемый пост)
 попросили пользователя ввести "Stop", если  верно, то вышли, нет, просим еще раз

Это должно получицц что-то вроде этого ?
Код

public class Main {
          public static void main(String[] args) throws Exception{
             String p = "";
             NewThread obj = new NewThread();
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             while(true){
             System.out.println("Scan - To scan");
         System.out.println("Exit - To exit");
             p = br.readLine();
         
            if (p.equalsIgnoreCase("Scan")){
           System.out.println("Please enter STOP");
            obj.MainFunction();
               do{
                 char с = (char) br.read();                 
                      }
while (c!='stop')
              if (p.equalsIgnoreCase("Exit")){
             System.exit(0);
}
             }
           }
}

Я чего - то не понимаю, зачем вводить СТОП ??
PM MAIL   Вверх
nornad
Дата 7.10.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Samotnik @  7.10.2007,  22:10 Найти цитируемый пост)
nornad, пожалуйста скажи номер строки, где следует писать  ран ?

В предыдущем варианте строки 20-86 уходят в класс сканера. Можно всё запихнуть в ран, а можно разбить на методы по логике работы.

Добавлено через 3 минуты и 59 секунд
Цитата(Vasay @  7.10.2007,  23:27 Найти цитируемый пост)
отработала -> (это на будущее) попросили пользователя ввести "Stop", если  верно, то вышли, нет, просим еще раз

Я тоже не понял, зачем это smile

Добавлено через 4 минуты и 43 секунды
Короче, в мэйне тебе надо сделать такой цикл:


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


Эксперт
****


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

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



1. char - это один символ, он равен слову быть не может.

Цитата


Я чего - то не понимаю, зачем вводить СТОП ?? 


Впринципе, он нам не нужен, но так как для начала, я хочу, чтоб ты запустил только один поток, то стоп нам нужен, для того, чтоб корректно его остановить, а не ждать пока он завершит работу

Перечитал задание, подумал, что много мы в отдельную функцию вынесли, в потоке не должно быть никакого общения с юзером...


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


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

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