/** | |
* @author Jerry Lee | |
*/ | |
public class Testee { | |
static long countTimeIn500ms = 0; | |
public static void main(String[] args) throws Exception { | |
countTimeIn500ms = guessCountTimeIn500ms(); | |
Thread runAndSleepTask = new Thread(new RunAndSleepTask(), "RunAndSleepTask"); | |
Thread runAndWaitTask = new Thread(new RunAndWaitTask(), "RunAndWaitTask"); | |
Thread runAndLongSleepTask = new Thread(new RunAndLongSleepTask(), "RunAndLongSleepTask"); | |
runAndSleepTask.start(); | |
runAndWaitTask.start(); | |
runAndLongSleepTask.start(); | |
System.out.println("Tasks started!"); | |
Thread.sleep(Long.MAX_VALUE); | |
} | |
public static class RunAndSleepTask implements Runnable { | |
@Override | |
public void run() { | |
String name = this.getClass().getSimpleName(); | |
while (true) { | |
for (long i = 0; i < countTimeIn500ms; i++) { | |
} | |
System.out.println(name + ": " + new Date()); | |
try { | |
Thread.sleep(500); | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
public static class RunAndWaitTask implements Runnable { | |
@Override | |
public void run() { | |
String name = this.getClass().getSimpleName(); | |
while (true) { | |
for (long i = 0; i < countTimeIn500ms; i++) { | |
} | |
try { | |
System.out.println(name + ": " + new Date()); | |
synchronized (this) { | |
this.wait(500); | |
} | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
public static class RunAndLongSleepTask implements Runnable { | |
@Override | |
public void run() { | |
String name = this.getClass().getSimpleName(); | |
while (true) { | |
for (long i = 0; i < countTimeIn500ms; i++) { | |
} | |
System.out.println(name + ": " + new Date()); | |
try { | |
Thread.sleep(5000); | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
/** | |
* @return 100ms可以做{@code long}的计数次数。 | |
*/ | |
static long guessCountTimeIn500ms() { | |
System.out.println("start guess."); | |
long count = 1000L * 1000 * 1000; | |
// simple warm-up | |
for (long i = 0; i < count; i++) { | |
// nothing! | |
} | |
long tick = System.currentTimeMillis(); | |
for (long i = 0; i < count; i++) { | |
// nothing! | |
} | |
long duration = System.currentTimeMillis() - tick; | |
System.out.printf("1G times count take %d ms.\n", duration); | |
return count * 500 / duration; | |
} | |
} |
转载于:https://www.cnblogs.com/wangdaijun/p/7448863.html