Cleanup and fixes

This commit is contained in:
Bruce Eckel 2017-01-03 10:50:09 -08:00
parent 45d4e5d85b
commit a2a7b53b95
6 changed files with 14 additions and 58 deletions

View File

@ -16,26 +16,26 @@ public class Atomicity {
public Atomicity(); public Atomicity();
Code: Code:
0: aload_0 0: aload_0
1: invokespecial #1 // Method 1: invokespecial #1 // Method
java/lang/Object."<init>":()V java/lang/Object."<init>":()V
4: return 4: return
void f1(); void f1();
Code: Code:
0: aload_0 0: aload_0
1: dup 1: dup
2: getfield #2 // Field i:I 2: getfield #2 // Field i:I
5: iconst_1 5: iconst_1
6: iadd 6: iadd
7: putfield #2 // Field i:I 7: putfield #2 // Field i:I
10: return 10: return
void f2(); void f2();
Code: Code:
0: aload_0 0: aload_0
1: dup 1: dup
2: getfield #2 // Field i:I 2: getfield #2 // Field i:I
5: iconst_3 5: iconst_3
6: iadd 6: iadd
7: putfield #2 // Field i:I 7: putfield #2 // Field i:I
10: return 10: return
} }
*/ */

View File

@ -8,7 +8,9 @@ import onjava.TimedAbort;
public class AtomicityTest implements Runnable { public class AtomicityTest implements Runnable {
private int i = 0; private int i = 0;
public int getValue() { return i; } public int getValue() { return i; }
private synchronized void evenIncrement() { i++; i++; } private synchronized void evenIncrement() {
i++; i++;
}
@Override @Override
public void run() { public void run() {
while(true) while(true)
@ -16,7 +18,8 @@ public class AtomicityTest implements Runnable {
} }
public static void main(String[] args) { public static void main(String[] args) {
new TimedAbort(4); new TimedAbort(4);
ExecutorService es = Executors.newCachedThreadPool(); ExecutorService es =
Executors.newCachedThreadPool();
AtomicityTest at = new AtomicityTest(); AtomicityTest at = new AtomicityTest();
es.execute(at); es.execute(at);
while(true) { while(true) {

View File

@ -6,8 +6,8 @@
// Synchronizing blocks instead of entire methods. Also // Synchronizing blocks instead of entire methods. Also
// demonstrates protection of a non-thread-safe class // demonstrates protection of a non-thread-safe class
// with a thread-safe one. // with a thread-safe one.
// {java threads.CriticalSection} // {java lowlevel.CriticalSection}
package threads; package lowlevel;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.*; import java.util.concurrent.atomic.*;
import java.util.*; import java.util.*;

View File

@ -4,8 +4,8 @@
// Visit http://OnJava8.com for more book information. // Visit http://OnJava8.com for more book information.
// {ThrowsException} on a multiprocessor machine // {ThrowsException} on a multiprocessor machine
// Using explicit Lock objects to create critical sections // Using explicit Lock objects to create critical sections
// {java threads.ExplicitCriticalSection} // {java lowlevel.ExplicitCriticalSection}
package threads; package lowlevel;
import java.util.concurrent.locks.*; import java.util.concurrent.locks.*;
// Synchronize the entire method: // Synchronize the entire method:

View File

@ -1,16 +0,0 @@
// lowlevel/QuittableTask.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
import onjava.Nap;
public class QuittableTask implements Runnable {
private boolean running = true;
public void quit() { running = false; }
public boolean running() { return running; }
@Override
public void run() {
while(running)
new Nap(100);
}
}

View File

@ -1,31 +0,0 @@
// lowlevel/QuittingTasks.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
import java.util.*;
import java.util.stream.*;
import java.util.concurrent.*;
public class QuittingTasks {
public static void main(String[] args)
throws InterruptedException {
ExecutorService exec =
Executors.newCachedThreadPool();
List<QuittableTask> tasks =
IntStream.range(1, 1000)
.mapToObj(i -> new QuittableTask())
.peek(exec::execute)
.collect(Collectors.toList());
TimeUnit.MILLISECONDS.sleep(100);
tasks.forEach(QuittableTask::quit);
exec.shutdown();
exec.awaitTermination(1, TimeUnit.SECONDS);
// See if any tasks are still running:
System.out.println(
tasks.stream()
.anyMatch(QuittableTask::running));
}
}
/* Output:
false
*/