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;
}
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 –
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
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. –