OnJava8-Examples/tasks/ThreadVariations.java

193 lines
4.3 KiB
Java
Raw Normal View History

2016-01-25 18:05:55 -08:00
// tasks/ThreadVariations.java
2015-12-15 11:47:04 -08:00
// (c)2016 MindView LLC: see Copyright.txt
2015-11-15 15:51:35 -08:00
// We make no guarantees that this code is fit for any purpose.
// Visit http://mindviewinc.com/Books/OnJava/ for more book information.
2016-01-25 18:05:55 -08:00
// Creating threads with inner classes
2015-06-15 17:47:35 -07:00
import java.util.concurrent.*;
// Using a named inner class:
class InnerThread1 {
private int countDown = 5;
private Inner inner;
private class Inner extends Thread {
Inner(String name) {
super(name);
start();
}
@Override
public void run() {
try {
while(true) {
2015-11-03 12:00:44 -08:00
System.out.println(this);
2015-06-15 17:47:35 -07:00
if(--countDown == 0) return;
sleep(10);
}
} catch(InterruptedException e) {
2015-11-03 12:00:44 -08:00
System.out.println("interrupted");
2015-06-15 17:47:35 -07:00
}
}
@Override
public String toString() {
return getName() + ": " + countDown;
}
}
public InnerThread1(String name) {
inner = new Inner(name);
}
}
// Using an anonymous inner class:
class InnerThread2 {
private int countDown = 5;
private Thread t;
public InnerThread2(String name) {
t = new Thread(name) {
@Override
public void run() {
try {
while(true) {
2015-11-03 12:00:44 -08:00
System.out.println(this);
2015-06-15 17:47:35 -07:00
if(--countDown == 0) return;
sleep(10);
}
} catch(InterruptedException e) {
2015-11-03 12:00:44 -08:00
System.out.println("sleep() interrupted");
2015-06-15 17:47:35 -07:00
}
}
@Override
public String toString() {
return getName() + ": " + countDown;
}
};
t.start();
}
}
// Using a named Runnable implementation:
class InnerRunnable1 {
private int countDown = 5;
private Inner inner;
private class Inner implements Runnable {
Thread t;
Inner(String name) {
t = new Thread(this, name);
t.start();
}
@Override
public void run() {
try {
while(true) {
2015-11-03 12:00:44 -08:00
System.out.println(this);
2015-06-15 17:47:35 -07:00
if(--countDown == 0) return;
TimeUnit.MILLISECONDS.sleep(10);
}
} catch(InterruptedException e) {
2015-11-03 12:00:44 -08:00
System.out.println("sleep() interrupted");
2015-06-15 17:47:35 -07:00
}
}
@Override
public String toString() {
return t.getName() + ": " + countDown;
}
}
public InnerRunnable1(String name) {
inner = new Inner(name);
}
}
// Using an anonymous Runnable implementation:
class InnerRunnable2 {
private int countDown = 5;
private Thread t;
public InnerRunnable2(String name) {
t = new Thread(new Runnable() {
@Override
public void run() {
try {
while(true) {
2015-11-03 12:00:44 -08:00
System.out.println(this);
2015-06-15 17:47:35 -07:00
if(--countDown == 0) return;
TimeUnit.MILLISECONDS.sleep(10);
}
} catch(InterruptedException e) {
2015-11-03 12:00:44 -08:00
System.out.println("sleep() interrupted");
2015-06-15 17:47:35 -07:00
}
}
@Override
public String toString() {
return Thread.currentThread().getName() +
": " + countDown;
}
}, name);
t.start();
}
}
// A separate method to run some code as a task:
class ThreadMethod {
private int countDown = 5;
private Thread t;
private String name;
public ThreadMethod(String name) { this.name = name; }
public void runTask() {
if(t == null) {
t = new Thread(name) {
@Override
public void run() {
try {
while(true) {
2015-11-03 12:00:44 -08:00
System.out.println(this);
2015-06-15 17:47:35 -07:00
if(--countDown == 0) return;
sleep(10);
}
} catch(InterruptedException e) {
2015-11-03 12:00:44 -08:00
System.out.println("sleep() interrupted");
2015-06-15 17:47:35 -07:00
}
}
@Override
public String toString() {
return getName() + ": " + countDown;
}
};
t.start();
}
}
}
public class ThreadVariations {
public static void main(String[] args) {
new InnerThread1("InnerThread1");
new InnerThread2("InnerThread2");
new InnerRunnable1("InnerRunnable1");
new InnerRunnable2("InnerRunnable2");
new ThreadMethod("ThreadMethod").runTask();
}
2015-09-07 11:44:36 -06:00
}
/* Output:
2015-06-15 17:47:35 -07:00
InnerThread1: 5
InnerThread2: 5
InnerThread1: 4
InnerThread2: 4
InnerThread1: 3
InnerThread2: 3
InnerThread1: 2
InnerThread2: 2
InnerRunnable1: 5
InnerThread1: 1
InnerThread2: 1
InnerRunnable2: 5
InnerRunnable1: 4
InnerRunnable2: 4
InnerRunnable1: 3
InnerRunnable2: 3
InnerRunnable1: 2
InnerRunnable2: 2
InnerRunnable1: 1
InnerRunnable2: 1
ThreadMethod: 5
ThreadMethod: 4
ThreadMethod: 3
ThreadMethod: 2
ThreadMethod: 1
2015-09-07 11:44:36 -06:00
*/