В синхронном программировании с задачей параллельности могут справляться процессы, либо потоки/среды.
Процессы -- приложения загруженные в память, они имеют выделенную под свои нужды оперативную память, которая доступна только им, а также если овладевают ресурсом, то другие процессы не имеют доступа к ним.
Потоки -- сущности внутри процесса, которые могут разделять между собой одну память процесса, а также ресурсы, которыми он овладел. За тем, чтобы не было проблем (взаимовмешательств, согласованности хранения в памяти) нужно следить за этим из приложения.
Процессы тоже могут взаимодействовать именно для этого и существуют технологии IPC(Inter Processes Communication). Для этого используются пайпы и сокеты, при этом с помощью сокетов, процессы не должны обязательно быть запущенны на одном копьютере, сокеты это сетевое взаимодействие.
В яве в основном пишуться многопоточные приложения, но также при большом желании и оправданности можно попробовать написать мультипроцессное, при этом необязательно, чтобы все процессы-подули были написаны на джава, для этого есть етилита для запуска внешних процессов java.lang.ProcessBuilder.
Итак многопоточное приложение. В таком приложении разделяется два основных ресурса: процессорное время(при этом их может быть несколько, или же ядер, или и того и другого, но какбы там не было этот ресурс ограничен все-равно для одновременного выполнения определенного количества потоков, равного Sum[i=1..Qprocessors](Qcores i) ), ресурсы приложения (обьекты, потоки-стримы, файлы).
Первый вид ресурса разделяется методами вида:
1. (Low level API)Thread.start
2. (Low level API)Thread.sleep
3. (Low level API)Thread.yield
4. (Low level API)Thread.notify[All]
5. (High level API) ExecutorService es = Executors.newChachedThreadPool(3);
6. (High level API) es.execute(Runnable)
7. (High level API) Future f = es.submit(Callable); f.get();//sleep while answer will arrive
Второй:
1. (Low level API) class C { synchronized void method(){...}} это intrinsic lock or monitor lock; это реализация мьютекса в джава, только в Си он блокирует вызов, а в Яве поток(то есть сихронизированный метод может быть рекурсивно вызван - потому что один и тот же поток - блокировка не произойдет, в Си такой вызов не возможен)
2. (Low level API) synchronized (lockObkect) {//....dangerous code.....}
3. (High level API) Lock lock = new ReentrantLock(); lock.tryLock();
4. (High level API) ConcurrentMap map = new ConcurrentMap<>(); map.putIfAbsent(key, value);
Процессы -- приложения загруженные в память, они имеют выделенную под свои нужды оперативную память, которая доступна только им, а также если овладевают ресурсом, то другие процессы не имеют доступа к ним.
Потоки -- сущности внутри процесса, которые могут разделять между собой одну память процесса, а также ресурсы, которыми он овладел. За тем, чтобы не было проблем (взаимовмешательств, согласованности хранения в памяти) нужно следить за этим из приложения.
Процессы тоже могут взаимодействовать именно для этого и существуют технологии IPC(Inter Processes Communication). Для этого используются пайпы и сокеты, при этом с помощью сокетов, процессы не должны обязательно быть запущенны на одном копьютере, сокеты это сетевое взаимодействие.
В яве в основном пишуться многопоточные приложения, но также при большом желании и оправданности можно попробовать написать мультипроцессное, при этом необязательно, чтобы все процессы-подули были написаны на джава, для этого есть етилита для запуска внешних процессов java.lang.ProcessBuilder.
Итак многопоточное приложение. В таком приложении разделяется два основных ресурса: процессорное время(при этом их может быть несколько, или же ядер, или и того и другого, но какбы там не было этот ресурс ограничен все-равно для одновременного выполнения определенного количества потоков, равного Sum[i=1..Qprocessors](Qcores i) ), ресурсы приложения (обьекты, потоки-стримы, файлы).
Первый вид ресурса разделяется методами вида:
1. (Low level API)Thread.start
2. (Low level API)Thread.sleep
3. (Low level API)Thread.yield
4. (Low level API)Thread.notify[All]
5. (High level API) ExecutorService es = Executors.newChachedThreadPool(3);
6. (High level API) es.execute(Runnable)
7. (High level API) Future f = es.submit(Callable); f.get();//sleep while answer will arrive
Второй:
1. (Low level API) class C { synchronized void method(){...}} это intrinsic lock or monitor lock; это реализация мьютекса в джава, только в Си он блокирует вызов, а в Яве поток(то есть сихронизированный метод может быть рекурсивно вызван - потому что один и тот же поток - блокировка не произойдет, в Си такой вызов не возможен)
2. (Low level API) synchronized (lockObkect) {//....dangerous code.....}
3. (High level API) Lock lock = new ReentrantLock(); lock.tryLock();
4. (High level API) ConcurrentMap
Комментариев нет:
Отправить комментарий