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

Многопоточная обработка дерева

16.11.2014, 11:43. Показов 909. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть следующий класс реализующий интерфейс Runnable:
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
public class TreeHandler implements Runnable {
    private String name;
    private JTree tree;
    private Tree model;
 
    public TreeHandler(String name, JTree tree) {
        this.name = name;
        this.tree = tree;
        model = (Tree)tree.getModel();
    }
 
    @Override
    public void run() {
        Node node;
        String nodeName;
        int nodeNum;
        int fibonacci;
        System.out.println(name + " started");
        while (true) {
            System.out.println(name + " want to find node for handling");
            synchronized (tree) {
                while (true) {
                    Node root = (Node)(model.getRoot());
                    if (root == null || !isNumber(root)) {
                        System.out.println(name + " ended job");
                        return;
                    }
                    System.out.println(name + " get tree and searching...");
                    node = model.findNode(root, tester);
                    if (node != null)
                        break;
                    System.out.println("For that time there are no nodes, " + name + " waiting...");
                    try {
                        tree.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(name + " found node " + node);
                nodeName = node.toString();
                nodeNum = Integer.parseInt(nodeName);
                model.setData(node, this.name + " start with " + nodeName);
                updateTree();
            }
            System.out.println(name + " handling " + nodeName);
            nodeNum = (int)(nodeNum > 47 ? 47-Math.random() * 7 : nodeNum < 20 ? 20 : nodeNum);
            fibonacci = fibo(nodeNum);
            System.out.println(name + " handled " + nodeName);
            synchronized (tree) {
                model.setData(node, name + " finished with " + nodeName + " with fibonacci = " + fibonacci);
                updateTree();
                tree.notifyAll();
            }
        }
    }
 
    private boolean isNumber(Object node) {
        try {
            Integer.parseInt(node.toString());
            return true;
        } catch (Exception e) {
            return false;
        }
    }
 
    public boolean isFinished(Object node) {
        return node.toString().indexOf("finish") >= 0;
    }
 
    public int fibo(int n) {
        if (n <= 0)
            return 0;
        else if (n == 1 || n == 2)
            return n;
        else
            return fibo(n-1) + fibo(n-2);
    }
 
    Predicate<Node> tester = (node)->{
        if (!isNumber(node))
            return false;
        Iterator<Node> itr = model.iterator(node);
        itr.next();
        while (itr.hasNext()) {
            if (!isFinished(itr.next()))
                return false;
        }
        return true;
    };
 
    void updateTree() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                tree.updateUI();
            }
        });
    }
}
Но насколько я понимаю, смысла в этих потоках в данном случае нет, так как дерево блокируется одним потоком. Можно ли как-то реализовать многопоточную обработку дерева синхронизуя потоки по узлам, а не полностью по дереву?
Вроде можно как-то сделать с помощью ReentrantLock? Но я не пойму пока как это сделать. Помогите пожалуйста.
Вот класс узла:
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
public abstract class Node implements Iterable<Node>, Comparable<Node>, Serializable {
    protected Object data;
    protected Node parent;
    private final Lock lock = new ReentrantLock();
    
    public Lock getLock() {
        return lock;
    }
 
    public Node getParent() {
        return parent;
    }
    
    public void add(Node son) throws Exception {
        for (Node node : this) {
            if (node.equals(son))
                throw new Exception(son.toString() + " already exists!");
        }
        basicAdd(son);
    }
 
    public abstract void basicAdd(Node son);
 
    public void remove() {
        if (this.parent == null)
            return;
        
        Iterator<Node> it = parent.iterator();
        while (it.hasNext()) {
            Node node = it.next();
            if (node == this) {
                it.remove();
                return;
            }
        }
    }
 
    public abstract Node createNode(Object data);
    
    public int compareTo(Node o) {
        Node obj = (Node)o;
        return data.toString().compareTo(obj.data.toString());
    }
 
    public void setData(Object data) {
        this.data = data;
    }
 
    public Object getData() {
        return data;
    }
    
    public Object getChild(int index) {
        int i = 0;
        for (Node node : this) {
            if (i == index)
                return node;
            i++;
        }
        return null;
    }
 
    public int getChildCount() {
        int i = 0;
        for (Node node : this)
            i++;
            
        return i;
    }
 
    public int getIndexOfChild(Node son) {
        int i = 0;
        for (Node node : this) {
            if (node == son)
                return i;
            i++;
        }
        return -1;
    }
 
    public boolean isLeaf() {
        return (getChildCount() == 0);
    }
 
    public String toString() {
        return data.toString();
    }
 
    @Override
    public abstract Iterator iterator();
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((data == null) ? 0 : data.hashCode());
        result = prime * result + ((parent == null) ? 0 : parent.hashCode());
        return result;
    }
 
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Node other = (Node) obj;
        if (data == null) {
            if (other.data != null)
                return false;
        } else if (!data.equals(other.data))
            return false;
        if (parent == null) {
            if (other.parent != null)
                return false;
        } else if (!parent.equals(other.parent))
            return false;
        return true;
    }
 
    public void forwardTraverse(Consumer<Node> p) {
        p.accept(this);
        for (Node node : this) {
            node.forwardTraverse(p);
        }
    }
 
    public void backwardTraverse(Consumer<Node> p) {
        final Stack<Node> stack = new Stack<Node>();
        this.forwardTraverse((node)->stack.push((Node)node));
        while (!stack.empty())
            p.accept(stack.pop());
    }
 
    public Node findNode(Predicate<Node> tester) {
        Node result = null;
        if (tester.test(this))
            return this;
        else
            for (Node node : this) {
                result = node.findNode(tester);
                if (result != null)
                    return result;
            }
        return null;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2014, 11:43
Ответы с готовыми решениями:

Многопоточная обработка
Здравствуйте! Есть while, который берет записи из базы данных и обрабатывает их с помощью методов...

Многопоточная обработка
Здравствуйте, хочу сразу сказать, что это не вопрос, а больше ответ для тех, кто в нем...

c# многопоточная обработка транзакций
Мне нужно максимально быстро обработать некоторое кол-во транзакций (от 1 до нескольких тысяч)....

Многопоточная обработка файла
Всем доброго времени суток! У меня есть задача параллельной обработки файла некоторым...

5
20 / 20 / 9
Регистрация: 23.09.2013
Сообщений: 329
16.11.2014, 16:51 2
а что за дерево используется?
0
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 36
16.11.2014, 20:53  [ТС] 3
JTree
0
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
16.11.2014, 22:25 4
ReentrantLock по сути - тот же synchronized. Ничего принципиального при замене одного на другое не меняется.
Цитата Сообщение от jeremen Посмотреть сообщение
Можно ли как-то реализовать многопоточную обработку дерева синхронизуя потоки по узлам, а не полностью по дереву?
Это зависит от того какую именно обработку вы хотите реализовать. я из вашего кода так и не понял, что именно вы делаете. Какой-то он сильно запутанный
0
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 36
16.11.2014, 23:13  [ТС] 5
Вывод этапов обработки дерева каждым потоком в консоль.
0
20 / 20 / 9
Регистрация: 23.09.2013
Сообщений: 329
16.11.2014, 23:40 6
nodeNum = (int)(nodeNum > 47 ? 47-Math.random() * 7 : nodeNum < 20 ? 20 : nodeNum);
а здесь числа что обозначают?
0
16.11.2014, 23:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2014, 23:40
Помогаю со студенческими работами здесь

Многопоточная обработка списка
Друзья, подскажите, пожалуйста, правильно ли я делаю. Задача: Я реализовал это следующим...

Многопоточная обработка изображений
Приложение должно обеспечивать запуск до 10 потоков, обрабатывающих до 10 различных изображений...

Многопоточная обработка структур
Прошу сильно не ругать. Нужна помощь со студенческим заданием. Задание такое: В работе необходимо...

Многопоточная обработка файлов
Есть массив файлов, которые нужно обработать в многопоточном режиме. Пишу в одном потоке: ...


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

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