powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Поток или метод
25 сообщений из 38, страница 1 из 2
Поток или метод
    #38410710
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
public class TestRun extends Thread {
	
	private String str;
	
	public TestRun (String str) {
		this.str=str;
	}
	
	public void run() {
		System.out.println("без аргумента");
	}
	
	public void run (String str) {
		
		while(true){
			System.out.println("c аргументом: "+str);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public void start() {
		run (str);
	}
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class TestRunStart {

	public static void main(String[] args) {

		TestRun thread = new TestRun("111");
		thread.start();
	}
}



Если нужно передать параметр в метод старт, то thred запустится не как поток, а как обычный метод?
...
Рейтинг: 0 / 0
Поток или метод
    #38410711
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
другими словади, нужно чтобы по start() запустился run() с параметром
...
Рейтинг: 0 / 0
Поток или метод
    #38410717
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
public class TestRunStart {

    public static void main(String[] args) {
        new TestRun().start();
        new TestRun().start("1");
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class TestRun extends Thread {

    private String text;

    public synchronized void start(String text) {
        this.text = text;
        start();
    }

    @Override public void run() {
        if (text == null) {
            System.out.println("без аргумента");
        } else {
            try {
                while (true) {
                    System.out.println("c аргументом: " + text);
                    sleep(1000);
                }
            } catch (InterruptedException e) {}
        }
    }
}
...
Рейтинг: 0 / 0
Поток или метод
    #38410730
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp.mk, спасибо, то что надо!
...
Рейтинг: 0 / 0
Поток или метод
    #38410770
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда без веской причины не делайте extends Thread , так как это противоречит тому, как в джаве строится работа с потоками. Корректное решение:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class TestRun implements Runnable {

    private String text;

    public TestRun (String text) {
        this.text = text;
    }

    @Override public void run() {
        if (text == null) {
            System.out.println("без аргумента");
        } else {
            try {
                while (true) {
                    System.out.println("c аргументом: " + text);
                    sleep(1000);
                }
            } catch (InterruptedException e) {}
        }
    }
}
...
Рейтинг: 0 / 0
Поток или метод
    #38410796
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv, насколько я знаю, основное преимущество Runnable - это возможность экстендить класс, в то время как с Thread мы не сможем это сделать.
...
Рейтинг: 0 / 0
Поток или метод
    #38410799
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Поток или метод
    #38410800
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174cdtyjv, насколько я знаю, основное преимущество Runnable - это возможность экстендить класс, в то время как с Thread мы не сможем это сделать.Не понял вас. Runnable и Callable - два интерфейса, через которые можно и нужно определять задачи для потоков. Сам поток трогать не надо.
...
Рейтинг: 0 / 0
Поток или метод
    #38410804
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174основное преимущество Runnable - это возможность экстендить класс, в то время как с Thread мы не сможем это сделать.Как раз таки, наоборот (если я конечно же Вас правильно понял). extends Thread - расширяем класс Thread .
...
Рейтинг: 0 / 0
Поток или метод
    #38410806
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174основное преимущество Runnable Основной смысл Runnable - фрагмент кода, который будет выполняться , например, в потоке.
...
Рейтинг: 0 / 0
Поток или метод
    #38410807
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
[offtop]
"Компьютер — это конечный автомат. Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы"

(С) Алан Кокс
Код: plaintext
[/offtop]
...
Рейтинг: 0 / 0
Поток или метод
    #38410828
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usmanrema174основное преимущество Runnable - это возможность экстендить класс, в то время как с Thread мы не сможем это сделать.Как раз таки, наоборот (если я конечно же Вас правильно понял). extends Thread - расширяем класс Thread .

вот что я имел ввиду
авторThe most common difference is when you extends Thread class, after that you can’t extend any other class which you required. (As you know, Java does not allow inheriting more than one class). When you implements Runnable, you can save a space for your class to extend any other class in future or now.
...
Рейтинг: 0 / 0
Поток или метод
    #38410851
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174вот что я имел ввидуЭто то понятно. Общие принципы остаются неизменными.
Можно было не затрагивать конкретные реализации классов/интерфейсов, а выразиться в общих чертах.
Поэтому мы не так поняли. ;)
...
Рейтинг: 0 / 0
Поток или метод
    #38410859
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНикогда без веской причины не делайте extends Thread , так как это противоречит тому, как в джаве строится работа с потоками. Корректное решение:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class TestRun implements Runnable {

    private String text;

    public TestRun (String text) {
        this.text = text;
    }

    @Override public void run() {
        if (text == null) {
            System.out.println("без аргумента");
        } else {
            try {
                while (true) {
                    System.out.println("c аргументом: " + text);
                    sleep(1000);
                }
            } catch (InterruptedException e) {}
        }
    }
}



Свеном это некорректное решение

на Spark мы можем вполне получить
без аргумента

даже если передали стрингу
...
Рейтинг: 0 / 0
Поток или метод
    #38410906
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Свеном это некорректное решение

на Spark мы можем вполне получить
без аргумента

даже если передали стрингуПоясните почему?
...
Рейтинг: 0 / 0
Поток или метод
    #38410927
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ты про final, то ты ошибаешься. Конструктор раннабл и запуск четко happens-before. rtfm
...
Рейтинг: 0 / 0
Поток или метод
    #38411097
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Это смотря как запускать

если executor.submit или thread.start то да.

Но если просто из другого потока дернуть то никакого HB не будет.

Поэтому код Свенома не до конца корректен и у нас в продукте ревью бы не прошел.
...
Рейтинг: 0 / 0
Поток или метод
    #38411100
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

http://shipilev.net/pub/talks/j1-April2013-jmm.pdf

Потому что нужно использовать точечный freeze happens-before который даёт модификатор final на полею
...
Рейтинг: 0 / 0
Поток или метод
    #38411272
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Это смотря как запускать
если executor.submit или thread.start то да.Во, видите, как интересно выходит. То есть, если запускать Runnable через Thread.start(), то все нормально, ибо между запуском потока и первым действием в Runnable стоит synchronized-with. Если запускать через executor, то тоже все нормально, так как там свои механизмы обеспечивают synchronized-with (например, Lock). А вот если ... а вот если ... а вот хз, какой еще там есть "если". Если только высасывать из пальца какую-то ерунду.

Коллега, ваша проблема заключается в том, что уже не первый раз пытаясь меня в чем-то подловить, вы лезете в какие-то узкие частности, которые совершенно не имеют отношения к контексту темы. Например, в этой теме автор учится запускать потоки. Его цель - понять, как между собой соотносятся Thread и Runnable. В этом контексте никаких проблем с видимостью нету, а следовательно совершенно не нужно грузить человека деталями вроде всяких happens-before, unsafe publication и модели памяти SPARC. Есть конкретный вопрос, есть не менее конкретный ответ. Когда у него возникнут вопросы по проблемам видимости или cемантики final полей, тогда и будем на них отвечать. А сейчас углубление в такие вещи принесет ему больше вреда, чем пользы.
Тоже самое относится и к случаю с соседнего топика, где вы меня упрекнули в "неоптимальности" удаления последовательных элементов в ArrayList. Ну да, можно сделать оптимальнее, но контекст то какой был? Он был такой, что автор немного затупил в сдвигах элементов в списке при удалении. И именно в этом ему надо было помочь, а не в рассуждениях о какой-то мифической "оптимальности".

Такие дела, коллега.
...
Рейтинг: 0 / 0
Поток или метод
    #38411282
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

Судя по тому как ты отвечаешь я был прав.
Ты фокусник ибо вместо того чтобы внять тому что тебя учат ты чего то обижаешься как маленький.

Я не автору писал я тебе писал и пытался понять ход твоих мыслей.

Ты делаешь абстрактный многопоточный Runnable.

Сегодня это пример автора и у нас есть неявный HB, а завтра твой Runnable взяли в одном потоке заинстанциировали а вдругом дернули метод а потом - ай на проде где нехороший кастомер юзает Spark у нас случился NullPointer вот незадача.
Скажешь нереальный кейс ? У нас у клиентом сплош и рядом Sparkи на продах.

Профессионализм программиста заключается не в умении ***издить на форумах и не в умении проходить идиотские интервью с дибильными вопросами по Hibernate.


Профессионализм он в мелочах и понимании того что ты пишешь.
...
Рейтинг: 0 / 0
Поток или метод
    #38411365
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01Я не автору писал я тебе писал и пытался понять ход твоих мыслей.Ну так я вам и объяснил ход своих мыслей. Он очень простой: помочь автору в том, в чем ему требуется помощь.

buldozer01Ты делаешь абстрактный многопоточный Runnable.
Сегодня это пример автора и у нас есть неявный HB, а завтра твой Runnable взяли в одном потоке заинстанциировали а вдругом дернули метод а потом - ай на проде где нехороший кастомер юзает Spark у нас случился NullPointer вот незадача.
Скажешь нереальный кейс ? У нас у клиентом сплош и рядом Sparkи на продах.Вот когда у автора будет такой код, тогда и поговорим. Сейчас же у автора стояла задача понять, как передать аргумент в Runnable, который запускается через Thread.start(). Эта задача и была решена

buldozer01Профессионализм программиста заключается не в умении ***издить на форумах и не в умении проходить идиотские интервью с дибильными вопросами по Hibernate.
Профессионализм он в мелочах и понимании того что ты пишешь.А профессионализм человека, который отвечает на вопросы других людей, заключается в том, что бы понятно и четко ответить на поставленный вопрос.
...
Рейтинг: 0 / 0
Поток или метод
    #38411392
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

Берем код автора

автор
public synchronized void start(String text) {
this.text = text;
start();
}


Берем код Свенома

автор Свеном
public TestRun (String text) {
this.text = text;
}



У автора блок synchronized железобетонно обеспечит HB.

У Свенома и близко не лежало.

Отсюда вопрос - Как так можно отвечать на вопрос автора что в ответе мы имеем не до конца корректный код.

И этот человек еще хочет новичков учить Java.
...
Рейтинг: 0 / 0
Поток или метод
    #38411406
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01 ,
Коллега, проблема в том, что упомянутый вами synchronized не обеспечивает HB . Сами поймете, почему, или пояснить? В коде автора HB обеспечивается за счет метода Thread.start().
...
Рейтинг: 0 / 0
Поток или метод
    #38411506
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv, можно у вас немного поучиться?
По поводу этого топика, мне непонятно, как метод run() класса TestRun
в принципе может вывести сообщение "без аргумента", даже если его запустить извращенным способом,
как предлагает buldozer01.

Для проверки я написал следующий тест:
Код: 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.
import org.junit.Test;

import java.util.Random;

/**
 * Тест потоков
 */
public class ThreadTest {
    private Runnable task;

    private boolean randomWait() {
        Random random = new Random();
        int waitTime = random.nextInt(1000);
        boolean interrupted = false;

        try {
            Thread.sleep(waitTime);
        } catch (InterruptedException e) {
            interrupted = true;
        }

        return !interrupted;
    }

    @Test
    public void happensBeforeTest() {
        Runnable createTask = new Runnable() {
            @Override
            public void run() {
                if (randomWait()) {
                    task = new TestRun("Все ОК!");
                }
            }
        };

        Runnable executeTask = new Runnable() {
            @Override
            public void run() {
                if (randomWait()) {
                    task.run();
                }
            }
        };

        Thread createTaskThread = new Thread(createTask);
        Thread executeTaskThread = new Thread(executeTask);

        createTaskThread.start();
        executeTaskThread.start();

        try {
            createTaskThread.join();
            executeTaskThread.join();
        } catch (InterruptedException ignored) {
        }
    }

    private static class TestRun implements Runnable {
        private String text;

        public TestRun(String text) {
            this.text = text;
        }

        public void run() {
            if (text == null) {
                System.out.println("Без аргумента");
            } else {
                try {
                    while (!Thread.currentThread().isInterrupted()) {
                        System.out.println("С аргументом: " + text);
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException ignored) {
                }
            }
        }
    }
}



Так вот, если поток выполнения работает до потока создания, будет выдано исключение NullPointerException
в строке
task.run();

и выполнение метода run(), который мог бы вывести "Без аргумента" даже не начнется.

Такой, теоретический вопрос, можно ли как-то запустить run(), чтобы он вывел эту заветную строку?
...
Рейтинг: 0 / 0
Поток или метод
    #38411539
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTID ,
Вопрос хороший и резонный, но в двух словах на него ответить сложно. Если сжато, то проблема заключается в том, что если вы в одном потоке изменяете состояние какой-то ячейки памяти, то вы не обязательно увидите это из другого потока. На то есть несколько причин:
1) Кэширование на уровне процессора.
2) Out-of-order execution на уровне процессора
3) Различные оптимизации на уровне компилятора (он так же может поставить операции out-of-order, так же может что-то закэшировать, и т.д.).

Поэтому, разговор идет про то, что проинициализировав переменную в одном потоке, далеко не факт, что вы увидите это изменение в другом потоке, если не предпримите неких мер предосторожности.

Что бы лучше понять механизм этих проблем, и то, как их можно решать, рекомендую вам почитать следующие вещи:
1) Статья Шипилева - http://habrahabr.ru/post/143390/
2) Java Concurreny in Practice - глава про unsafe publication;
3) Почитать про synchronized-with в JLS Chapter 17.

Если у вас останутся вопросы (а вероятность этого достаточно велика ), то отпишитесь мне на почту (см. мой профиль), и я вам отдельно по Скайпу это объясню, так как у меня под это дело уже заготовлен и код, воспроизводящий подобного рода проблемы, и картиночки есть, и т.д.. Вам это поможет понять суть подобных проблем, а мне будет как тренировка объяснения этого немного замысловатого материала.
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Поток или метод
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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