2016-06-05 15 views
0

Ich habe CPUx2 in einem Server und ich habe ein Programm, das viele Threads enthalten, wenn alle Threads eine lange Zeit brauchen, um etwas zu tun, ist es möglich, Thread.Sleep (10) zu verwenden, um CPU-Release-Auftrag in andere Threads freizugeben ? Könnte ich einfach thread.sleep verwenden und die CPU automatisch andere Threads wechseln lassen, um die Performance zu verbessern oder zu verbessern?Gibt Java Thread.sleep() den Prozessor frei?

aktualisiert am 2016/06/06: Jeder Thread konzentriert sich darauf, HTTP-Inhalte aus dem Internet mit Executors zu erhalten, während ich es verzögern mehr Zeit geben möchte, aber ich bin nicht so sicher, wann ich TimeUnit hinzugefügt habe. MILLISECONDS.sleep (10) in dem Code innerhalb ob die Verwendung entweder MILLISEKUNDEN oder Nanosekunde und mit wie vielen Zeitschlitz, der CPU auf auto lassen einen anderen Threads wechseln, so dass die Gesamtleistung fair sein kann:

@Override 
public void run() { 
    //this.RunActual = System.currentTimeMillis(); 

    if ("Started".equals(this.JobStatus)) { 
     String startDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS").format(Calendar.getInstance().getTime()); 
     System.out.println(this.HttpRequestAddress + " has started at " + startDate); 
     try { 
      this.url = new URL("http://" + this.HttpRequestAddress + ":" + this.HttpRequestPort); 
      this.conn = (HttpURLConnection) this.url.openConnection(); 
      this.conn.setRequestMethod(this.HttpRequestMethod); 
      this.conn.setReadTimeout(this.HttpRequestReadTimeout); 
      this.conn.setConnectTimeout(this.HttpRequestConnectionTimeout); 
      this.conn.setInstanceFollowRedirects(false); 
      for (HttpHeader hh : this.HttpRequestHeader) { 
       this.conn.setRequestProperty(hh.Name, hh.Value); 
      } 
      this.conn.connect(); 
      this.responseCode = 0; 
      this.responseCode = this.conn.getResponseCode(); 
      System.out.println(this.HttpRequestAddress + " has response header " + this.conn.getHeaderFields().toString()); 
      if (this.responseCode == HttpURLConnection.HTTP_OK) { 
       if (this.HttpResponseKeyword != null) { 
        boolean hasKeyword = false; 
        this.br = new BufferedReader(new InputStreamReader(this.conn.getInputStream(), this.httpResponseEncoding)); 
        while ((this.charRead = this.br.read(this.buffer, 0, this.BUFFER_SIZE)) > 0) { 
         this.sb.append(this.buffer, 0, this.charRead); 
         //System.out.println(this.sb.toString()); 
         if (this.HttpResponseContain && this.sb.indexOf(this.HttpResponseKeyword) > 0) { 
          hasKeyword = true; 
          break; 
         } 
         this.sb.setLength(0); 
         TimeUnit.MILLISECONDS.sleep(10); 
        } 
        if (this.HttpResponseContain && hasKeyword) { 
         System.out.println(this.HttpRequestAddress + " should include keyword, now it is included."); 
        } else if (this.HttpResponseContain && !hasKeyword) { 
         System.out.println(this.HttpRequestAddress + " should include keyword, but it is not included."); 
        } else if (!this.HttpResponseContain && !hasKeyword) { 
         System.out.println(this.HttpRequestAddress + " should not include keyword, now it is not included."); 
        } else if (!this.HttpResponseContain && hasKeyword) { 
         System.out.println(this.HttpRequestAddress + " should not include keyword, but it is included."); 
        } 
       } 
      } 
     } catch (Exception ex) { 
      String errorDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS").format(Calendar.getInstance().getTime()); 
      System.err.println(this.HttpRequestAddress + " has error at " + errorDate + " with " + ex.toString()); 
     } 
     String endDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS").format(Calendar.getInstance().getTime()); 
     System.out.println(this.HttpRequestAddress + " has end at " + endDate); 
    } 

    /* 
    if (this.RunNext != 0) { 
     long c = this.RunActual - this.RunNext; 
     if (c > 0) { 
      System.out.println(this.HttpRequestAddress + " has slowed " + c + " milliseconda."); 
     } 
    }*/ 

    //this.RunNext = System.currentTimeMillis() + this.JobInterval; 
} 
+2

Diese Frage ist zu breit. Es hängt davon ab, was die Threads machen. Einige fragen sich vielleicht, warum Sie viele Threads verwenden. Bitte zeigen Sie ein Codebeispiel Ihres Problems, das Ihr Problem ausdrückt –

+1

Was ist das Problem, das Sie versuchen zu lösen? Wenn die Threads Ihre CPU zu 100% benutzen, dann laufen sie so schnell wie sie können und das Hinzufügen von 'sleep()' wird die Gesamtleistung nicht verbessern. Die Jobs müssen noch erledigt werden. Versuchen Sie, sie zu "drosseln", verlangsamen Sie sie, so dass sie weniger CPU verbrauchen? Warum? Wenn Sie möchten, dass andere Programme normal ausgeführt werden, verringern Sie die Thread-Priorität Ihrer Threads. Auf diese Weise werden alle verfügbaren CPUs verwendet, andere Programme können jedoch mit minimaler Verzögerung ausgeführt werden. – Andreas

+0

Es gibt fast nie einen guten Grund, 'Thread.sleep()' aufzurufen. Wenn Sie es in einer Echtzeitanwendung verwenden, um die Dinge im richtigen Moment zu erreichen, dann sollten Sie besser die JRE-Klasse "ScheduledThreadPoolExecutor" oder die Timer-Klasse eines GUI-Frameworks verwenden. Wenn Sie es verwenden, um die Menge an Arbeit, die von verschiedenen Threads ausgeführt wird, auszugleichen, dann gibt es wahrscheinlich einen anderen, besseren Weg. Wenn Sie es verwenden, um sicherzustellen, dass die Dinge in der richtigen Reihenfolge passieren, machen Sie wahrscheinlich einen schrecklichen Fehler. –

Antwort

2

wie Sie mutmaßen ruft Thread.sleep() ruft den Prozessor in den meisten gängigen Betriebssystemen auf. Sie müssen jedoch Thread.sleep() nicht aufrufen, um den Prozessor auf den meisten Betriebssystemen freizugeben, da das Betriebssystem sowieso zu anderen Threads wechselt. Die Verwendung von Thread.sleep() kann die Effizienz relativ zu einer Schleife verbessern, die ständig nach einer Abschlussbedingung sucht, aber eine bessere Lösung besteht oft darin, Wartezeiten zu verwenden und benachrichtigt, sodass der Thread bei Bedarf aufwachen kann und nicht in Intervallen überprüft werden muss.

4

Thread.sleep() gibt den Prozessor für einen anderen ausführbaren Thread oder Prozess frei und markiert den aktuellen Thread als nicht ausführbar, bis die Ruhezeit abläuft.

JEDOCH und in re Ihre Bearbeitung, wird Ihr Code die meiste Zeit blockiert beim Lesen aus dem Netzwerk verbringen. Das Hinzufügen von Betten in diesen Code ist völlig sinnlos. Nicht. Das Betriebssystem weiß bereits, wie es geplant wird, und TCP weiß bereits, wie die Bandbreite geteilt wird.