BG Development


Страници: (5) [1] 2 3 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Java нишки
hihi88
Публикувано на: 22-05-2018, 21:43
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 22.05.18



Имам нужда от помощ. Имам за задача да напиша Java конзолно приложение което проверява колко нишки могат да се стартират едновременно на даден хост. Стигнал съм до някъде обаче не знам как да завърша кода напълно. Става на въпрос че се зарежда от максималната нища и започва отначало всичко.
Ето и кода който използвам..

public class ThreadTest {

public static void main(String[] pArgs) throws Exception {
try {
while (true) {
new TestThread().start();
}
} catch (OutOfMemoryError e) {
System.out.println("Макс Нишки: " + TestThread.БРОЙ);
System.exit(-1);
}
}

static class TestThread extends Thread {

private static int БРОЙ = 0;

public TestThread() {
БРОЙ++;
}

public void run() {
while (true) {
try {
Thread.sleep(20);
System.out.println("Макс Нишки: " + TestThread.БРОЙ);

} catch (InterruptedException e) {

}
}

}
}
}



Това мнение е било редактирано от hihi88 на 22-05-2018, 21:49
PMEmail Poster
Top
thrawn
Публикувано на: 23-05-2018, 07:45
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1651
Регистриран на: 17.01.17



Не почва от начало. Просто всяка нишка принтера едно и също на около 20 ms.

За имена на променливи, функции, класове или каквото и да било никога не ползвай кирилица.
Щом работиш с един и същи ресурс в различни нишки трябва да синхронизираш достъпът до него. При положение, че критерия ти е препълване на паметта (това ми се струва подозрителен подход), извеждай съобщението за брой нишки само при обработка на изключението а не циклично във всяка нишка.
PMEmail Poster
Top
hihi88
Публикувано на: 23-05-2018, 08:58
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 22.05.18



Понеже не съм много запознат помогнато ми е за този код .А преподавателят ми изисква да пишем на кирилица.Може ли да ми обясниш малко по подробно какво точно трябва да направя. icon_smile.gif
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 23-05-2018, 09:01
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 928
Регистриран на: 21.02.18



Трябва да се направи програмен език на кирилица и да се спре с английския фашизъм!


--------------------
Напред! Живота е сраженье!
Напред! И прав всегда ходи!
Напред, макар към поражение!
Ако ще паднеш, прав падни!
---
Axis of faith; Raw, and untamed in spirit
To do and undo...
We chew this world; And Spit it out
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 23-05-2018, 09:50
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1651
Регистриран на: 17.01.17



Като начало, трябва да кажеш на преподавателя ти, че ако него го кефи да му се подиграват то теб не те кефи.
Ако все пак държи на кирилицата го посъветвай да се преквалифицира - търсят се преподаватели и по БЕЛ.

Ето ти преработено решението ти. Само гледай да не си утрепеш машината.
CODE
public class ThreadTest {

   public static void main(String[] pArgs) throws Exception {
       try {
           while (true) {
               new TestThread().start();
           }
       } catch (OutOfMemoryError e) {
           System.out.println("Out of memory ...");
       }
            
       System.out.println("Макс Нишки: " + TestThread.getCounter());
       System.exit(0);
   }

   static class TestThread extends Thread {

       private static int COUNT = 0;

       private static synchronized void incrementCounter() {
           COUNT++;
       }

       private static synchronized int getCounter() {
           return COUNT;
       }

       public TestThread() {

       }

       @Override
       public void run() {
           TestThread.incrementCounter();

           while (true) {
               try {
                   Thread.sleep(20);
                   // System.out.println("Макс Нишки: " + TestThread.БРОЙ);
               } catch (InterruptedException e) {

               }
           }
       }
   }
}


Това мнение е било редактирано от thrawn на 23-05-2018, 09:55
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 23-05-2018, 09:54
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 928
Регистриран на: 21.02.18



сега ако го направи както е правилно с CountDownLatch / Cyclicbarrier вместо Thread.sleep() ще получи шестица


--------------------
Напред! Живота е сраженье!
Напред! И прав всегда ходи!
Напред, макар към поражение!
Ако ще паднеш, прав падни!
---
Axis of faith; Raw, and untamed in spirit
To do and undo...
We chew this world; And Spit it out
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 23-05-2018, 09:59
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1651
Регистриран на: 17.01.17



Какво сте се хванали за тоя брояч, все едно дава нещо уникално. Хубавото при него (и при семафорът) е, че има опция да блокира (и за това се ползва, блокираш и чакаш нещо да се изпълни). В случая просто трябва да се инкрементира една променлива а синхронизацията си е заложена по начало в езикът.
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 23-05-2018, 10:14
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 928
Регистриран на: 21.02.18



synchronized методите ги признаха за design грешка и не е хубаво да се ползват.

Обаче проблема тук не е в синхронизацията – а в Thread.sleep(20) и безкрайния цикъл.

Много по-яко е да се направи с CountDownLatch, а и сихронизацията може да се замени с AtomicLong.

ПП: бозата крашна след 280 000

CODE
public final class Main {
   public static void main(String[] args) throws Exception {
       final CountDownLatch latch = new CountDownLatch(1);
       final AtomicLong counter = new AtomicLong();
       while (true) {
           new Thread(() -> {
               try {
                   latch.await();
               } catch (InterruptedException e) {
                   //no-op
               }
           }).start();
           System.out.println(counter.incrementAndGet());
       }
   }


--------------------
Напред! Живота е сраженье!
Напред! И прав всегда ходи!
Напред, макар към поражение!
Ако ще паднеш, прав падни!
---
Axis of faith; Raw, and untamed in spirit
To do and undo...
We chew this world; And Spit it out
PMEmail PosterUsers Website
Top
hihi88
Публикувано на: 23-05-2018, 10:25
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 22.05.18



Благодаря много. Сега ще опитам. Но възможно ли е да не стане нищо понеже съм с windows 10. И като цялостно ни кара да работим със NeatBeans. Защото в момента сложих кода и пуснах програмата и отново ми заби лаптопа.
PMEmail Poster
Top
thrawn
Публикувано на: 23-05-2018, 10:30
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1651
Регистриран на: 17.01.17



Така работиш с броячът в основната нишка. Трябва да инкрементираш в run метода, за да е сигурно, че нишката е запалила.

Иначе, дали ще ползваш синхронизиран метод или блок, не виждам разлика (освен, че блокът е с по-добра защита, щото е капсулиран). Но приемам забележката.
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (5) [1] 2 3 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0