2017-03-24 4 views
0

J'ai besoin d'écrire deux programmes. 1 séquentielle (Terminé) et 1 parallèle et je l'ai fait quelque chose, mais je ne sais pas si je l'ai fait parallèle ou non et je aussi besoin de savoir:Je suis un débutant en programmation et j'ai besoin d'aide et de conseils

  1. Si (Thread.State state = Discussion .currentThread() getState();.) est le code pour afficher le statut d'un fil
  2. comment attribuer différents fils à des processeurs différents (4 noyaux)
  3. Comment afficher l'état du processeur
  4. calcul pour chaque processeur
  5. comment générer des messages d'erreur (erreurs de cohérence mémoire, etc.)

Après mon code:

class Threads implements Runnable { 

    @Override 
    public void run() { 

     Thread t = Thread.currentThread(); 

     Thread.State state = Thread.currentThread().getState(); 
     String Assignment = "calculations in array"; 
     String name = "os.name"; 
     String version = "os.version"; 
     String architecture = "os.arch"; 
     String[] array = new String[1312500]; 
     int size = array.length; 

     Random r = new Random(); 
     int[] values = new int[1312500]; 
     int sumarray = 0; 
     int CountD = 0; 

     for (int i = 0; i < values.length; i++) { 
      int randomint = r.nextInt(100); 

      values[i] = randomint; 

      if ((values[i] % 2 != 0) && (values[i] >= 25 && values[i] <= 75)) { 
       sumarray += values[i]; 
       CountD++; 
      } 
     } 

     System.out.println(t.getName()); 
     System.out.println("Thread Id " + t.getId()); 
     System.out.println("Thread Priority " + t.getPriority()); 
     System.out.println("status " + state); 
     System.out.println("OS Name: " + System.getProperty(name)); 
     System.out.println("OS Version: " + System.getProperty(version)); 
     System.out.println("OS Architechture: " + System.getProperty(architecture)); 
     System.out.println(Assignment); 
     System.out.println("Size of the Array is: " + array.length); 
     System.out.println("Total number of system cores(processors): " + Runtime.getRuntime().availableProcessors()); 
     System.out.println("Difference of Array and Processors 1312500/4 = " 
       + array.length/Runtime.getRuntime().availableProcessors()); 
     System.out.println("The size of array is divisible by the number of processors"); 
     System.out.println("Summary is: " + sumarray); 
     System.out.println("The Average is: " + (sumarray/CountD)); 
    } 

} 

Classe principale:

class Concurrent { 

    public static void main(String[] args) { 
     Thread t1 = new Thread(new Threads()); 
     t1.start(); 

     Thread t2 = new Thread(new Threads()); 
     t2.start(); 

     Thread t3 = new Thread(new Threads()); 
     t3.start(); 

     Thread t4 = new Thread(new Threads()); 
     t4.start(); 
    } 
} 
+0

Vous avez besoin de google up un tutoriel sur Threads et Java et commencer là. Bonne chance. – 7663233

+0

a fait beaucoup de cela mais encore confus et ne peux pas trouver quelque chose même à distance liée à mes besoins. –

+0

Salut et bienvenue à Stackoverflow. Veuillez lire le [guide de visite] (http://stackoverflow.com/tour) pour apprendre comment poser des questions correctement et comment fonctionne stackoverflow. –

Répondre

3

[J'ai besoin de savoir] Si Thread.State state = Thread.currentThread().getState(); est le code pour afficher l'état d'un fil.

qui déclare une variable nommée state et initialisées avec l'état du fil dans lequel il est exécuté. (https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html

Ce fragment de code n'affiche rien, mais la suite System.out.println("status " + state); écriront une représentation de l'état vers la console.

Je n'ai aucun moyen de savoir savoir si Thread.State correspond à ce que vous appelez " état », mais appelant Thread.currentThread().getState(); ne donne aucun renseignement parce que l'état d'un fil sera toujours RUNNABLE pendant qu'il appelle getState().

[J'ai besoin de savoir] comment assigner différents threads à différents processeurs

Je parie que non.

Ce que vous demandez est appelé "affinité du processeur". La plupart des programmes s'appuient sur le système d'exploitation pour planifier automatiquement les threads exécutables sur les processeurs disponibles. Ce ne sont que des programmes très sophistiqués (et notez que «sophistiqué» ne signifie pas toujours «bon») qui doivent être modifiés.

Il n'existe pas de méthode standard pour définir l'affinité CPU des threads Java, mais vous pouvez utiliser certains moyens sur votre système d'exploitation. Vous pouvez google "affinité de processeur Java" pour plus d'informations.

[je dois savoir] Comment afficher l'état du processeur

Vous allez devoir expliquer ce que « le statut » signifie et aussi, quel processeur, et quand?En fonction de ce que signifie "état", si vous écrivez du code pour demander le "statut" du même processeur sur lequel le code s'exécute, la réponse ne changera probablement jamais. Tout comme le résultat de Thread.currentThread().getState() ne change jamais.

Processeur « statut » est le genre de chose qui sysadmins des grands centres de données aiment voir sur les courbes, mais ils sont rarement utiles dans les un programme à moins que, encore une fois, vous faites quelque chose de très sophistiqué.

[J'ai besoin de savoir] comment générer des messages d'erreur.

La façon la plus simple de le faire est d'utiliser System.out.println(...) ou System.err.println(...)

Peut-être que vous avez vraiment voulu dire demander autre chose, comme la façon de savoir quand pour signaler une erreur, ou comment gérer les exceptions.

La plupart des routines de bibliothèque Java lèvent une exception en cas de problème. Tout ce que vous avez à faire dans ce cas est complètement ignorer. Si vous n'écrivez aucun code pour gérer l'exception, votre programme affichera automatiquement un message d'erreur et s'arrêtera lorsque l'exception sera levée.

+1

"Je parie que vous n'avez pas" obtient un upvote de moi. Une grande quantité de patience et de retenue ici. – Gray

+0

@james large je n'ai toujours rien obtenu mais que les processeurs Affinity était une réponse millionnaire cherchait depuis dix jours mais n'a pas pu obtenir ce terme mais s'il vous plaît pouvez-vous me dire que j'ai fait un processus parallèle ou non (oui ou non) –

+0

@MoizFarooqui, Votre programme commence quatre threads. Chacun de ces quatre threads exécute une instance de la même classe 'Threads'; et puisque le constructeur de classe ne prend aucun argument, chacun des quatre threads fera exactement la même chose que les autres. Oui, ils fonctionneront simultanément, mais je soupçonne qu'ils ne font peut-être pas ce que vous vouliez. Habituellement, différents threads font des choses différentes, ou font la même chose avec des données différentes. Vos threads font tous la même chose avec les mêmes données. –

0

comment assigner différents threads différents processeurs (4 cœurs)

Laissons cette décision d'exécution Java. Du point de vue du programmeur, essayez d'utiliser les fonctionnalités qui s'offrent à vous.

Pour utilizaiton efficace des cœurs de processeur, un coup d'oeil à cette question:

Java: How to scale threads according to cpu cores?

En ce qui concerne l'affinité du processeur, vous pouvez vérifier les messages:

Java thread affinity

http://tools.assembla.com/Behemoth/browser/Tests/JAVA/test/src/main/java/test/threads/ThreadAffinity.java (écrit par begemot

Mais vous devriez éviter ce genre de chose s et se concentrer sur la logique métier.

comment générer messeges d'erreur (erreurs mémoire de cohérence, etc.)

Vous pouvez facilement générer des erreurs de cohérence de la mémoire. Ne protégez pas votre code avec des constructions thread-safe telles que synchronized ou Lock et autorisez plusieurs threads à mettre à jour les données de votre classe.

Jetez un oeil à cette documentation page

Se reporter à documentation liens pour une meilleure compréhension des concepts multi-threading.