С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 14
1

Потоки, семафор в задаче про корабли

05.08.2018, 08:10. Показов 8493. Ответов 3

Author24 — интернет-сервис помощи студентам
Здравствуйте. Задание такое:


Порт. Корабли заходят в порт для разгрузки/загрузки контейнеров. Число
контейнеров, находящихся в текущий момент в порту и на корабле, должно
быть неотрицательным и превышающим заданную грузоподъемность суд-
на и вместимость порта. В порту работает несколько причалов. У одного
причала может стоять один корабль. Корабль может загружаться у причала,
разгружаться или выполнять оба действия.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author user
 */
public class Port {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Semaphore port = new Semaphore(5);
        Ship ship1 = new Ship(port,10);
        Ship ship2 = new Ship(port,10);
        Ship ship3 = new Ship(port,10);
        Ship ship4 = new Ship(port,10);
        Ship ship5 = new Ship(port,10);
        Ship ship6 = new Ship(port,10);
        Ship ship7 = new Ship(port,10);
        Ship ship8 = new Ship(port,10);
        Ship ship9 = new Ship(port,10);
        Ship ship10 = new Ship(port,10);
        
    }
}
 
 
class Ship extends Thread
{
    
    private Semaphore port;
    Ship(Semaphore port,int cargo)
    {
        this.port = port;
        this.start();
       
    }
    @Override 
    public void run()
    {
        getPrint();
        try {
            port.acquire();
            getPrintString();
            port.release();
        } catch (InterruptedException ex) {
            Logger.getLogger(Ship.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private void getPrint()
    {
        System.out.println(this.getName() + " waiting for port");
    }
    private void getPrintString()
    {
        System.out.println(this.getName() + " unloading of cargo");
        try {
            
            this.sleep(10000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Ship.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println(this.getName() + " realise cargo");
        
    }
    
}

Семафоры расставлены, собственно, теперь вопрос - можно ли придумать какую-либо общую коллекцию на все созданные потоки, которая бы принимала значения, переданные в конструкторе при создании корабля - потока (т.е. разгружала бы контейнеры в порту), и отдавала бы некоторые значения (т.е. загружала бы контейнерами корабли, не превышая заданную грузоподъемность)?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2018, 08:10
Ответы с готовыми решениями:

Потоки, Java. Семафор
Доброго времени суток форумчане, недавно в обучении столкнулся с потоками, вроде все работает как...

семафор и потоки
Добрый день господа программисты, так как в системном программировании я нуб, прошу помочь мне в...

Потоки, мьютекс и семафор
Вот задание: Выполнить индивидуальное задание параллельным алгоритмом (обязательно использовать для...

Потоки и объект синхронизации семафор
Доброго времени суток. Есть задача: Напишите программу, использующую семафор для ограничения...

3
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
05.08.2018, 10:06 2
Цитата Сообщение от kilinochi Посмотреть сообщение
можно ли придумать
благословляю, придумывай
0
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
06.08.2018, 11:41 3
Лучший ответ Сообщение было отмечено kilinochi как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
 * что-то типо блокирующей очереди 
 * текущая загруженность порта может быть не справедлива для всех тредов одновременно,
 *  т.к. этот параметр находится в стеке разных тредов одновременно и может быть ошибочным
 */
 
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
import java.util.LinkedList;
import java.util.Queue;
@ThreadSafe
public class PortDataBase<E> {
    @GuardedBy("this")
    private Queue<E> data = new LinkedList<E>();
 
    public synchronized void add(E e) {
        while (this.data.size() > 3) {
            System.out.println("Извините порт перегружен, " + Thread.currentThread().getName() + " ожидает очереди когда произведётся отгрузка из порта");
            try {
                wait();
            } catch (InterruptedException e1) {
                System.out.println("итеррапт перехвачен");
            }
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e3) {
            e3.printStackTrace();
        }
        this.data.add(e);
        System.out.println(Thread.currentThread().getName() + " Доставил груз в порт, текущая загруженность порта " + this.data.size() + " из 3");
        notifyAll();
    }
 
    public synchronized E del() {
        while (this.data.size() == 0) {
            System.out.println("Извините, в порту груз отсутствует, " + Thread.currentThread().getName() + " ожидает очереди когда груз поступит в порт");
            try {
                wait();
            } catch (InterruptedException e) {
                System.out.println("итеррапт перехвачен");
            }
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        E rsl = this.data.poll();
        System.out.println(Thread.currentThread().getName() + " Произвёл отгрузку из порта, текущая заполненность порта " + this.data.size() + " из 3");
        notifyAll();
        return rsl;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * Класс корабли
 */
abstract class Ship extends Thread {
 
    public static class ShipDownload extends Ship {
        private final PortDataBase port;
        private int cargo;
 
        public ShipDownload(PortDataBase port, int cargo) {
            this.port = port;
            this.cargo = cargo;
        }
 
        @Override
        public void run() {
            this.port.add(this.cargo);
        }
    }
    public static class ShipUpload extends Ship {
        private final PortDataBase port;
 
        public ShipUpload(PortDataBase port) {
            this.port = port;
        }
 
        @Override
        public void run() {
            this.port.del();
        }
    }
}
Тестирование написанного выше:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import static org.hamcrest.Matchers.is;
import org.junit.Test;
 
import static org.junit.Assert.assertThat;
 
 
public class ShipTest {
    @Test
    public void whentestPortDatabase() throws InterruptedException {
        Thread t = Thread.currentThread();
        t.setName("Корабль expected");
 
        PortDataBase<Integer> port = new PortDataBase<Integer>();
        Thread ship1 = new Thread(new Ship.ShipDownload(port, 10), "Корабль поставщик ship1");
        Thread ship2 = new Thread(new Ship.ShipDownload(port, 10), "Корабль поставщик ship2");
        Thread ship3 = new Thread(new Ship.ShipDownload(port, 10), "Корабль поставщик ship3");
        Thread ship4 = new Thread(new Ship.ShipDownload(port, 10), "Корабль поставщик ship4");
        Thread ship5 = new Thread(new Ship.ShipDownload(port, 10), "Корабль поставщик ship5");
        Thread ship6 = new Thread(new Ship.ShipDownload(port, 10), "Корабль поставщик ship6");
        Thread ship7 = new Thread(new  Ship.ShipUpload(port), "Корабль отгрузчик ship7");
        Thread ship8 = new Thread(new  Ship.ShipUpload(port), "Корабль отгрузчик ship8");
        Thread ship9 = new Thread(new  Ship.ShipUpload(port), "Корабль отгрузчик ship9");
        Thread ship10 = new Thread(new Ship.ShipUpload(port), "Корабль отгрузчик ship10");
        Thread ship11 = new Thread(new Ship.ShipUpload(port), "Корабль отгрузчик ship11");
        
        ship1.start();
        ship2.start();
        ship3.start();
        ship4.start();
        ship5.start();
        ship6.start();
        ship7.start();
        ship8.start();
        ship9.start();
        ship10.start();
        ship11.start();
        
        ship1.join();
        ship2.join();
        ship3.join();
        ship4.join();
        ship5.join();
        ship6.join();
        ship7.join();
        ship8.join();
        ship9.join();
        ship10.join();
        ship11.join();
        
        assertThat(port.del(), is(10));
    }
Кликните здесь для просмотра всего текста
Корабль поставщик ship1 Доставил груз в порт, текущая загруженность порта 1 из 3
Корабль отгрузчик ship11 Произвёл отгрузку из порта, текущая заполненность порта 0 из 3
Корабль поставщик ship3 Доставил груз в порт, текущая загруженность порта 1 из 3
Корабль отгрузчик ship10 Произвёл отгрузку из порта, текущая заполненность порта 0 из 3
Извините, в порту груз отсутствует, Корабль отгрузчик ship9 ожидает очереди когда груз поступит в порт
Извините, в порту груз отсутствует, Корабль отгрузчик ship8 ожидает очереди когда груз поступит в порт
Извините, в порту груз отсутствует, Корабль отгрузчик ship7 ожидает очереди когда груз поступит в порт
Корабль поставщик ship6 Доставил груз в порт, текущая загруженность порта 1 из 3
Корабль поставщик ship5 Доставил груз в порт, текущая загруженность порта 2 из 3
Корабль поставщик ship4 Доставил груз в порт, текущая загруженность порта 3 из 3
Корабль поставщик ship2 Доставил груз в порт, текущая загруженность порта 4 из 3
Корабль отгрузчик ship7 Произвёл отгрузку из порта, текущая заполненность порта 3 из 3
Корабль отгрузчик ship8 Произвёл отгрузку из порта, текущая заполненность порта 2 из 3
Корабль отгрузчик ship9 Произвёл отгрузку из порта, текущая заполненность порта 1 из 3
Корабль expected Произвёл отгрузку из порта, текущая заполненность порта 0 из 3
1
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 14
08.08.2018, 07:52  [ТС] 4
Спасибо)
0
08.08.2018, 07:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2018, 07:52
Помогаю со студенческими работами здесь

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

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

Ошибка в задаче про студентов
Задача про студентов. База данных считывается из файла и записывается в другой файл.Программа...

Ошибка в задаче про два прямоугольника
Здравствуйте! Решаю задачу с курса на openedu и возникла ошибка при проверке. Код предоставлен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru