0% found this document useful (0 votes)
70 views

The Runnable Interface Has 1 Method: Run Use Implements Runnable AND Define Run

The Runnable interface has a single run() method. An alternative threading approach is to implement Runnable and define the run() method. The document then demonstrates creating three threads - one each to print a character, b character, and numbers 1-100. Each task implements Runnable and defines its run() method. The threads are started to run concurrently.

Uploaded by

Sheyla Cárdenas
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
70 views

The Runnable Interface Has 1 Method: Run Use Implements Runnable AND Define Run

The Runnable interface has a single run() method. An alternative threading approach is to implement Runnable and define the run() method. The document then demonstrates creating three threads - one each to print a character, b character, and numbers 1-100. Each task implements Runnable and defines its run() method. The threads are started to run concurrently.

Uploaded by

Sheyla Cárdenas
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

Runnable interface

— The Runnable interface has 1 method: run()


— Alternative threading approach:
—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
*/

public PrintChar(char c, int t) {


charToPrint = c;
times = t;
}

/**
* 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

private int lastNum;

/**
* 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.

— setPriority(int newPriority) changes the priority of


this thread.
— Other predefined priorities are
— MAX_PRIORITY
— MIN_PRIORITY

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)

— If you need to update a GUI component from a non-GUI thread


— This method will post the “runnable” (your frame) to an event
queue
— … and immediately return to the caller
— The event queue is a “queue” data structure: the runnable instances are
executed in the order in which they were inserted

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

Platform.runLater(() -> 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);
}
}

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

You might also like