Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2017, 13:27   #1
incurable
Новичок
Джуниор
 
Регистрация: 07.10.2017
Сообщений: 3
По умолчанию Потоки

Добрый день. Возникли проблемы с потоками : программа работающая в одном потоке работает быстрее чем в 3х. Так же есть volatile переменная, которую потоки иногда обрабатывают с одним и тем же значением. А вот и сам код:

Код:
public class lab2 extends Thread {
    static volatile int from=1000000;
    int to=4000000; 
    lab2(String name){
        super(name);
    }
     
    public void run(){
        System.out.printf("Поток %s начал работу... \n", Thread.currentThread().getName());
        System.out.printf("Поток %s завершил работу за %d наносек \n", Thread.currentThread().getName(),solve());
    }
    public long solve(){
    	long start=System.nanoTime();
    	while(from<=to){
    		if(from%(3)==0)
    			System.out.println(from);
    		from++;
    	}
        long finish=System.nanoTime();
        return finish-start;
    }
    public static long solve(int from,int to){
    	int k=0;
    	long start=System.nanoTime();
      	while(from<=to){
    		if(from%(3)==0)
    			System.out.println(from);
    		from++;
    	}
        long finish=System.nanoTime();
        return finish-start;
    }
    
    public static void main(String[] args) { 
        System.out.println("Главный поток начал работу...");
        lab2 t1=new lab2("First");
        lab2 t2=new lab2("Second");
        lab2 t3=new lab2("Third");
        t1.start();
        t2.start();
        t3.start();
        

        //System.out.printf("Главный поток завершил работу за %d наносек",solve(1000000,4000000));
  
        
    }
}
спасибо за внимание
______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось incurable; 07.10.2017 в 13:32.
incurable вне форума Ответить с цитированием
Старый 07.10.2017, 13:47   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от incurable Посмотреть сообщение
Так же есть volatile переменная, которую потоки иногда обрабатывают с одним и тем же значением
Я не помню как volatile работает в Java, но очень сомневаюсь, что оно предназначено для такого применения.
И даже если б это было безопасно, то это
Цитата:
Сообщение от incurable Посмотреть сообщение
Код:
if(from%(3)==0)
    System.out.println(from); 
from++;
точно нет.
Что мешает другому потоку взять from между чтением и инкрементом тут?

Может лучше просто каждому потоку назначать начальное и конечное значения при запуске?

System.out.println кстати тоже не потокобезопасный.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 07.10.2017 в 13:51.
Alex11223 вне форума Ответить с цитированием
Старый 07.10.2017, 13:56   #3
incurable
Новичок
Джуниор
 
Регистрация: 07.10.2017
Сообщений: 3
По умолчанию

так я тоже пробовал. все равно в 1 потоке быстрее
Код:
public class lab2 extends Thread {
    int from;
    int to; 
    lab2(String name,int f,int t){
        super(name);
        from=f;
        to=t;
    }
     
    public void run(){
        System.out.printf("Поток %s начал работу... \n", Thread.currentThread().getName());
        System.out.printf("Поток %s завершил работу за %d наносек \n", Thread.currentThread().getName(),solve());
    }
    public long solve(){
    	long start=System.nanoTime();
    	while(from<=to){
    		if(from%(3)==0)
    			System.out.println(from);
    		from++;
    	}
        long finish=System.nanoTime();
        return finish-start;
    }
    public static long solve(int from,int to){
    	long start=System.nanoTime();
    	for(int i=from;i<=to;i++)
    		if(i%(3)==0)
    			System.out.println(i);
        long finish=System.nanoTime();
        return finish-start;
    }
    
    public static void main(String[] args) { 
        System.out.println("Главный поток начал работу...");
        lab2 t1=new lab2("First",1000000,2000000);
        lab2 t2=new lab2("Second",2000001,3000000);
        lab2 t3=new lab2("Third",3000001,4000000);
        t1.start();
        t2.start();
        t3.start();
        

        //System.out.printf("Главный поток завершил работу за %d наносек",solve(1000000,4000000));
  
        
    }
}
incurable вне форума Ответить с цитированием
Старый 07.10.2017, 14:02   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А чему тут быть быстрее? Вы по сути не делаете ничего кроме вывода в консоль.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.10.2017, 14:14   #5
incurable
Новичок
Джуниор
 
Регистрация: 07.10.2017
Сообщений: 3
По умолчанию

спасибо огромное)
добавил
Код:
    		double x=Math.sin(from)*Math.cos(from)/10;
    		double x1=Math.sin(from)*Math.cos(from)/10;
    		double x2=Math.sin(from)*Math.cos(from)/10;
    		double x3=Math.sin(from)*Math.cos(from)/10;
    		double x4=Math.sin(from)*Math.cos(from)/10;
и разница во времени ощутима.
я думал, что потоки дают преимущество во времени для всех операций.
Еще раз искренне благодарю)
incurable вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки (С++) Satansoft Помощь студентам 8 23.11.2014 19:39
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
потоки MetR Помощь студентам 0 11.12.2011 19:07
Потоки в с# qwerty74 C# (си шарп) 5 22.06.2011 13:57
потоки tanek Помощь студентам 6 15.03.2010 21:42