powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / многопотоковая проблемка в джаве
12 сообщений из 12, страница 1 из 1
многопотоковая проблемка в джаве
    #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
многопотоковая проблемка в джаве
    #39477410
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зеленый админПривет. Есть джава класс. Вот код:
Читайте, пожалуйста, кодконвеншн , пока не пожелтеете

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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


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