The Runnable Interface Has 1 Method: Run Use Implements Runnable AND Define Run
The Runnable Interface Has 1 Method: Run Use Implements Runnable AND Define Run
26
(c) Paul Fodor & Pearson Inc.
Using the Runnable Interface to
Create and Launch Threads
Create and run three threads:
The first thread prints the letter a 100 times.
The second thread prints the letter b 100 times.
The third thread prints the integers 1 through
100.
27
(c) Paul Fodor & Pearson Inc.
public class TaskThreadDemo { TaskThreadDemo.java
public static void main(String[] args) {
// Create tasks
Runnable printA = new PrintChar('a', 100);
Runnable printB = new PrintChar('b', 100);
Runnable print100 = new PrintNum(100);
// Create threads
Thread thread1 = new Thread(printA);
Thread thread2 = new Thread(printB);
Thread thread3 = new Thread(print100);
// Start threads
thread1.start();
thread2.start();
thread3.start();
}
28 } (c) Paul Fodor & Pearson Inc.
// The task for printing a specified character in specified times
class PrintChar implements Runnable { TaskThreadDemo.java
private char charToPrint; // The character to print
private int times; // The times to repeat
/**
* Construct a task with specified character and number of times to print
* the character
*/
/**
* Override the run() method to tell the system what the task to perform
*/
public void run() {
for (int i = 0; i < times; i++) {
System.out.print(charToPrint);
}
}
29
} (c) Paul Fodor & Pearson Inc.
// The task class for printing number from 1 to n for a given n
class PrintNum implements Runnable {
TaskThreadDemo.java
/**
* Construct a task for printing 1, 2, ... i
*/
public PrintNum(int n) {
lastNum = n;
}
/**
* Tell the thread how to run
*/
public void run() {
for (int i = 1; i <= lastNum; i++) {
System.out.print(" " + i);
}
}
30
(c) Paul Fodor & Pearson Inc.
}
The Static yield() Method
You can use the yield() method to temporarily release
time for other threads.
public void run() {
for (int i = 1; i <= lastNum; i++){
System.out.print(" " + i);
Thread.yield();
}
}
Every time a number is printed, the print100 thread is
yielded. So, the numbers are printed after the characters.
31
(c) Paul Fodor & Pearson Inc.
The Static sleep(milliseconds) Method
The sleep(long mills) method puts the thread to
sleep for the specified time in milliseconds.
public void run() {
for (int i = 1; i <= lastNum; i++) {
System.out.print(" " + i);
try {
if (i >= 50) Thread.sleep(1);
}
catch (InterruptedException ex) {
}
}
}
Every time a number (>= 50) is printed, the
print100 thread is put to sleep for 1 millisecond.
32
(c) Paul Fodor & Pearson Inc.
Checking the state of a thread
isAlive() method is used to find out the state of a thread.
It returns true if a thread is in the Ready, Blocked, or Running state;
it returns false if a thread is new and has not started or if it is
finished.
interrupt() method interrupts a thread:
If a thread is currently in “ready” or “running”, its interrupted flag is
set.
If a thread is currently “blocked”, it is awakened and becomes
“ready”, and an java.io.InterruptedException is thrown.
isInterrupted() tests whether this thread has been interrupted.
33
(c) Paul Fodor & Pearson Inc.
Thread Priority
A thread is assigned a default priority
NORM_PRIORITY
These are “constant” field values, implemented as
static final int.
34
(c) Paul Fodor & Pearson Inc.
GUIs and Threads
What if we want to make our frame multi-
threaded?
implement Runnable
GUI event handling and painting code executes
in a single thread, called the event dispatcher
thread.
This ensures that each event handler finishes
executing before the next one executes and the
painting isn’t interrupted by events.
35
(c) Paul Fodor & Pearson Inc.
GUIs and Threads
public static void runLater(java.lang.Runnable runnable)
36
(c) Paul Fodor & Pearson Inc.
import javafx.application.Application; FlashText.java
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class FlashText extends Application {
private String text = "";
@Override
public void start(Stage primaryStage) {
StackPane pane = new StackPane();
Label lblText = new Label("Programming is fun");
pane.getChildren().add(lblText);
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
if (lblText.getText().trim().length() == 0) {
text = "Welcome";
} else {
text = "";
37
} (c) Paul Fodor & Pearson Inc.
Platform.runLater(new Runnable() {
@Override
public void run() {
lblText.setText(text);
}
});
Thread.sleep(200);
}
} catch (InterruptedException ex) {
}
} }).start();
Scene scene = new Scene(pane, 200, 50);
primaryStage.setTitle("FlashText");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args); } }
38
(c) Paul Fodor & Pearson Inc.
import javafx.application.Application; FlashTextUsingLambda.java
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class FlashTextUsingLambda extends Application {
private String text = "";
@Override
public void start(Stage primaryStage) {
StackPane pane = new StackPane();
Label lblText = new Label("Programming is fun");
pane.getChildren().add(lblText);
new Thread(() -> {
try {
while (true) {
if (lblText.getText().trim().length() == 0) {
text = "Welcome";
} else {
text = "";
}
39
(c) Paul Fodor & Pearson Inc.
FlashTextUsingLambda.java
40
(c) Paul Fodor & Pearson Inc.
Killing a thread
Threads usually perform actions repeatedly
What if you want to tell a thread to stop doing what it’s doing?
This takes cooperation between threads
Do not use the stop method --- it's deprecated:
It kills threads immediately
A thread’s run method may be mid-algorithm when killed
Preferred option: ask thread to kill itself. How?
via your own instance variable
make it a loop control for run
lets the thread set its affairs in order before dying
41
(c) Paul Fodor & Pearson Inc.
Typical run structure
public class NiceThread extends Thread {
private boolean die = false;
public void askToDie() {
die = true;
}
public void run() {
while (!die) {
// do work here
try {
sleep(1000);
} catch (InterruptedException ie) {
}
}
// set affairs in order: DEAD IS DEAD
}
public static void main(String[] args){
NiceThread t = new NiceThread();
t.start();
t.askToDie();
}
42 } (c) Paul Fodor & Pearson Inc.
Timer Threads
Common Problem:
Need program to do something X times/second
Like what?
count time
display time
update and render scene
2 Java Options:
have your thread do the counting
have a Java java.util.Timer instance do
43 the counting (c) Paul Fodor & Pearson Inc.
Java Timers
Execute TimerTasks on schedule
via its own hidden thread
What do we do?
define our own TimerTask
put work in run() method
construct our task
construct a timer
schedule task on timer
cancel method unschedules our task (i.e. kills it)
44
(c) Paul Fodor & Pearson Inc.
import java.util.Timer; Run:
import java.util.TimerTask; TimerTask scheduled.
public class TimerDemo { Test 1
int i = 0; Test 2
class MyTimerTask extends TimerTask { Test 3
public void run() { Test 4
System.out.println("Test " + (++i)); Test 5
} …
Test 49
}
Test 50
public TimerDemo() {
TimerTask finished.
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), 0, 100);
System.out.println("TimerTask scheduled.");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("got interrupted!");
}
timer.cancel(); // What happens if cancel() isn’t called?
System.out.println("TimerTask finished.");
}
public static void main(String args[]) {
TimerDemo td = new TimerDemo();
45 }
(c) Paul Fodor & Pearson Inc.
}