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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2014, 15:35   #1
Yarik1994
 
Регистрация: 13.12.2014
Сообщений: 4
По умолчанию Очередь процессов

Всем привет! Вообщем в java я новичок(совсем). Решил вот написать программку: Есть один поток процессов, который обслуживается одним процессором с одной очередью. Хочу сделать так, чтобы программа пихала процесс в очередь, а процессор брал и выполнял процессы из очереди. Вроде бы простая задачка, НО мне совсем не даётся. Прошу поделиться кодом, ссылками, чем угодно, что помогло бы решить задачу.

Собственно проблема именно с реализацией очереди( наверное )
Вот что у меня есть:

public interface ISemaphore {
public void release();
}
//processor
public class CPU implements ISemaphore {
private int processorsCount=1;
private int allProcessCount=0,destroyedProcessC ount=0;
private final Semaphore semaphore;

public int getAllProcessCount() {
return allProcessCount;
}

public int getDestroyedProcessCount() {
return destroyedProcessCount;
}

public CPU() {
this.semaphore=new Semaphore(this.processorsCount);
}

public CPU(int processorsCount) {
this.processorsCount=processorsCoun t;
this.semaphore=new Semaphore(this.processorsCount);
}

public void runProcess(CPUProcess process) {
allProcessCount++;
if (semaphore.tryAcquire()) {
process.start();
}
else {
destroyedProcessCount++;
process=null;
}
}

public void release() {
semaphore.release();
}

}
//process
public class CPUProcess extends Thread{
private ISemaphore semaphore;
private int runTime;

public CPUProcess(ISemaphore semaphore, int runTime) {
this.runTime=runTime;
this.semaphore=semaphore;
}

public void run() {
try {
Thread.sleep(runTime);
}
catch (InterruptedException e) {
System.err.println(e);
}
semaphore.release();
}
}

public class Main1 {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
CPU processors=new CPU();
try {
CPUProcess proc;
proc=new CPUProcess(processors,10);
processors.runProcess(proc);
Thread.sleep(100);
proc=new CPUProcess(processors,10);
processors.runProcess(proc);
proc=new CPUProcess(processors,10);
processors.runProcess(proc);
proc.join();
}
catch (InterruptedException e) {
System.err.println(e);
}

System.out.println("count: "+processors.getAllProcessCount ());
System.out.println("kill: "+processors.getDestroyedProcessCou nt());
}

}
Yarik1994 вне форума Ответить с цитированием
Старый 13.12.2014, 17:14   #2
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Если я правильно понял задачу, то есть два основных варианта ее реализации:
1) Вычислительная часть процессов (в примере, CPUProccess) выполняется самими этими процессами, а основной процесс (CPU) их только запускает в отдельном потоке.
2) Вычислительная часть процессов (в примере, CPUProccess) выполняется основным процессом (в примере, CPU).

Код:
package programmersforum;

/**
* Выполняемый процесс/задача, которые ставятся в очередь.
* В данном случае, в роли задачи каждого из таких процессов является вывод 
* собственного имени.
* @author BleStaR
*/
public class CPUProccess implements Runnable {
   // Имя процесса
   private final String name;
   /**
    * 
    * @param name Имя процесса
    */
   public CPUProccess(String name) {
       this.name = name;
   }
   /**
    * Метод, отвечающий за выполнение задачи, стоящей перед этим процессом.
    */
   public void execute() {
       System.out.println(String.format("Процесс [%s] выполнен", name));
   }
   
   @Override public void run() {
       execute();
   }
}
Код:
package programmersforum;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 
 * @author BleStaR
 */
public class CPU extends Thread {
    // Стэк процессов, которые необходимо будет выполнить
    private final List<CPUProccess> stack = new ArrayList<>();
    // Флаг работы основного процесса
    private boolean worked = true;
    /**
     * 
     * @return Стэк процессов, которые необходимо будет выполнить
     */
    public final List<CPUProccess> getProccesses() {
        return stack;
    }
    /**
     * 
     * @param b Флаг работы основного процесса
     */
    public final void setWorked(boolean b) {
        worked = b;
    }
    
    @Override public void run() {
        System.out.println("CPU начал работать.");
        try {
            while ( worked ) {
                // Проверка наличия процессов, которые необходимо выполнить
                if ( !stack.isEmpty() ) {
                    // Берем первый процесс из очереди
                    CPUProccess proccess = stack.get(0);
                    // Выполняем его
                    // Вариант 1 ===============================================
                     new Thread(proccess).start();
                    // =========================================================
                    // Вариант 2 ===============================================
                    // proccess.execute();
                    // =========================================================
                    // Удаляем из очереди. Перед операцией удаления, блокируем 
                    // стэк, что бы не возникли конфликты
                    synchronized( stack ) {
                        stack.remove(proccess);
                    }
                }
                // Приостанавливаем на 2 сек, что бы можно было лучше разгляделть 
                // работу стэка
                Thread.sleep(2000);
            }
        } catch ( InterruptedException ex ) {
        }
        System.out.println("CPU закончил работать.");
    }
    
    public static void main( String [] args ) {
        // Создаем и запускам CPU.
        CPU cpu = new CPU();
        cpu.start();
        // C консоли запрашиваем имя для нового процесса
        try (Scanner scanner = new Scanner(System.in)) {
            String in;
            do {
                in = scanner.nextLine();
                // Условия заверешния работы приложения
                if ( in.equals("quit") ) {
                    break;
                } else {
                    // Помещаем в стэк новый процесс
                    cpu.getProccesses().add(new CPUProccess(in));
                }
            } while (true);
        }
        // Завершаем работу CPU
        cpu.setWorked(false);
    }
    
}
BleStaR вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вводим 15 элементов в очередь, затем выводим на экран эту очередь и добавил в очередь еще один элемент. Потом удаляем любой элемен Xumera C++ Builder 2 07.12.2013 13:56
Убийца процессов Sh.I.Va Помощь студентам 20 15.11.2012 16:05
Создание задания, добавление процессов, удаление процессов RAZOR1703 Win Api 12 16.02.2012 18:07
Связка процессов MCLotos Операционные системы общие вопросы 2 10.04.2010 20:22
Блокировка процессов Zeraim Операционные системы общие вопросы 5 17.04.2008 13:02