Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / многопотоковая проблемка в джаве / 12 сообщений из 12, страница 1 из 1
25.06.2017, 23:58
    #39477378
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
Привет. Есть джава класс. Вот код:
Код: 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.
package mt_test;

import java.io.FileWriter;
import java.io.IOException;


class TTestThread extends Thread {
	public static int mValue;
	public static FileWriter mFileRes;  
	
	public void run() {
		int nValue;
		int arrRes[] = new int[100];
		while(true) {
			nValue = GetNext();
			if(nValue >= 100)
				break;
			
			for (int i = 0; i < nValue; i++) {
				arrRes[i] = i*nValue;
			}
			SaveResult(nValue, arrRes);
		}
	}
	
	synchronized void SaveResult(int nRes, int arrRes[]) {
		try {
			for (int i = 0; i < nRes; i++) {
				mFileRes.write("nRes=" + nRes + "," + arrRes[i] + "\n");
			}
			
			mFileRes.flush();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
	
	synchronized int GetNext() {
		mValue++;   
		return mValue;
	   }
	
	TTestThread(String AName) {
		super(AName);
		
		start();
	}
}

public class ClMTTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TTestThread.mValue = 0;
		
		int nCores = Runtime.getRuntime().availableProcessors();
		
		TTestThread ArrThr[]  = new TTestThread[nCores];
		
		try (FileWriter FW = new FileWriter("111.txt")) {
			TTestThread.mFileRes = FW;
			
			for (int i = 0; i < ArrThr.length; i++) {
				ArrThr[i] = new TTestThread("TTestThread #" + i);
			}
			
			for (int n2 = 0; n2 < ArrThr.length; n2++) {
				ArrThr[n2].join();
			}
			
		} catch (Exception e) {
				
		}
	}
}



Интересно, почему в 111.txt значения nRes не смежные. Например кусок из файла:
file ...
nRes=7,0
nRes=6,24
nRes=5,20
...
...
Рейтинг: 0 / 0
26.06.2017, 06:30
    #39477410
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
зеленый админПривет. Есть джава класс. Вот код:
Читайте, пожалуйста, кодконвеншн , пока не пожелтеете

зеленый админИнтересно, почему в 111.txt значения nRes не смежные.

А почему они должны быть смежными?
Какие прочитанные докумнеты ведут к такому выводу?
Или в С++/delphi вывод будет упорядочен?

Всё нормально- потоки выполняются как-то. Никто не обещал, что они будут выполнятся одновременно.
...
Рейтинг: 0 / 0
26.06.2017, 06:34
    #39477411
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
Собственно каждый потокнахватал себе чисел в одном порядке, а вывод пошёл в другом (так же случайном) порядке. Упорядоченность только в массиве каждого потока, а вот слияник (по сути тут слияние через файл) прошло... как-то так.
...
Рейтинг: 0 / 0
26.06.2017, 08:14
    #39477421
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
Alexey Tomin,

Алексей, вы не поняли вопрос. Я не говорю про сортировку значений при слиянии. Я говорю про последовательность значений при одном nRes. И благодаря тому, что SaveResult есть synchronized, я ожидал такое поведение. Кстати, я добился результата в случае если SaveResult определен еще как static. И вот это поведение не похоже ни на одни языки, которые мне тут упомянули выше (при условии, что synchronized - это вход в критическую секцию).
...
Рейтинг: 0 / 0
26.06.2017, 09:07
    #39477442
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
зеленый админЯ говорю про последовательность значений при одном nRes. И благодаря тому, что SaveResult есть synchronized, я ожидал такое поведение.
synchronized никак не влияет на порядок.

зеленый админКстати, я добился результата в случае если SaveResult определен еще как static.

Кстати, это к многопоточности отношения не имеет вообще никакого.

зеленый админИ вот это поведение не похоже ни на одни языки, которые мне тут упомянули выше (при условии, что synchronized - это вход в критическую секцию).
И какое же там поведение? Все входы в критическую секцию строго упорядочены?
...
Рейтинг: 0 / 0
26.06.2017, 09:28
    #39477467
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
зеленый админAlexey Tomin,

Алексей, вы не поняли вопрос. Я не говорю про сортировку значений при слиянии. Я говорю про последовательность значений при одном nRes.

А разве она нарушена?

зеленый админfile ...
nRes=7,0
nRes=6,24
nRes=5,20
...


Здесь путаница именно что для разных nRes
...
Рейтинг: 0 / 0
26.06.2017, 09:44
    #39477473
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
зеленый админПривет. Есть джава класс. Вот код:


А вообще код вызывает вопрос- а что, собственно, Вам хотелось?
Чем больше читаю, тем больше он меня удивляет.
Например - оба synchronized не нужны, т.к. они не делают ровным счётом НИЧЕГО.
Массив не нужен.
Ну и так далее.
...
Рейтинг: 0 / 0
26.06.2017, 11:34
    #39477585
guest2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
зеленый админ...
1. Сделайте SaveResult и GetNext статическими, тогда эти методы будут исполняться одновременно только в одном потоке, видимо как это предполагается. Сейчас они исполняются без синхронизации.
2. И я бы советовал start() из конструктора не вызывать, может привести к Race Conditions. Вызывайте явно после создания экземпляра потока.
...
Рейтинг: 0 / 0
26.06.2017, 11:42
    #39477591
guest2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
зеленый админ,

И прочитатье гайд по стилю кодирования в Java, как уже советовали.
Никто в Java не добавляет к названиям классов перфикс T, как в Delphi (TTestThread).
Префиксы для полей класса - не нужны (mValue).
Венгерская нотация - не нужна (nValue).
Названия методов - с маленькой буквы (SaveResult).
Исключения просто так не давите. В крайнем случае выведете его в лог или на консоль. Лучше в лог.
...
Рейтинг: 0 / 0
26.06.2017, 14:00
    #39477697
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
Blazkowiczзеленый админКстати, я добился результата в случае если SaveResult определен еще как static.
Кстати, это к многопоточности отношения не имеет вообще никакого.

Как это не имеет?!?! Мониторы же разные.
В одном случае класс в другом экземпляр.
...
Рейтинг: 0 / 0
26.06.2017, 14:19
    #39477725
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
Сергей Арсеньев Как это не имеет?!?! Мониторы же разные.
В одном случае класс в другом экземпляр.
Да, точно! С таким чудным соглашеним о кодировнии сложно понять зачем Thread-классу не статические synchronized методы, в принципе. В этом-то и основной косяк.
...
Рейтинг: 0 / 0
27.06.2017, 00:12
    #39478056
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопотоковая проблемка в джаве
Каждый раз читаю эксперименты newcomers с мультипоточностью и ... удивляюсь.

Все время хочу спросить.

А вам это зачем?

Какую вы задачу вообще решаете?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / многопотоковая проблемка в джаве / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]