PDA

Просмотр полной версии : Многопоточность и магия


gattsu
22.01.2017, 18:12
Реализовал многопоточный исполнитель, присутсвует только атомарная синхронизация с помощью volatile.

Все потоки общаются с помшью каналов передавая друг другу задачи для исполнения. Задачи передаются через специальный списки, очередь с возможность изьятия за O(1) , в данный момент только в LinkdedQueue, в ArrayQueue O. Разница между ними, то что LinkedQueue активно потребляет память, в то в время как ArrayQueue массив, который расширяется по необходимость, в общем может кому будет надо, все довольно просто, реализация не сильно объемна в коде.

Цель. Понадобилось ручное управление потока исполениния сложных задач, так как ForkJoinPool не представляется средства ручной балансировки нагрузки, там используется алгоритм "кражи" нагрузки. Очень интересная реализация ForkJoinPool, когда не можешь понять как работает код. Танцы с бубном, забавно, когда ForkJoinPool реализован с помощью магии.

ПС sun.misc.Contended решает проблемы

gattsu
22.01.2017, 18:13
actormodel / concurrent / source / — Bitbucket (https://bitbucket.org/actormodel/concurrent/src/)

gattsu
23.01.2017, 18:57
Добавил поток исполнения, теперь можно программировать поток исполнения с назначенным контекстом.




Код:


[CODE]
package concurrent.samples;

import concurrent.WorkerService;
import concurrent.subroutine.Flow;
/*
* long count = 0;
* long time = System.currentTimeMillis() + 1000;
* while(true) {
* count++;
* if(time


Зацыкленный поток исполнения, который отображает, каждую секунду, количество сделанных итерация.