Block 6 Threads 1 Jin Sa 20122021 Clientserver

Block 6: Threads 1 Jin Sa 20/12/2021 Client-server Programming 1

Outline of block 6 • • Why multi-threads and typical applications Defining and creating threads An example with two threads Life cycle of a thread An example with user interface Problem with threads Synchronisation among threads 20/12/2021 Client-server Programming 2

Why multithreading? • Most of the java programs you have seen so far can only do one thing at a time. In the real world many actions are happening concurrently. • Typical applications: – User interfacing, e. g. One deals with the drawing, the other deals with user interface – Many instances of similar behaviour, e. g. a concurrent server serves many clients – Many different tasks, e. g. open day simulation 20/12/2021 Client-server Programming 3

Two ways to define threads in Java • Extending the Thread class • Implementing the Runnable interface 20/12/2021 Client-server Programming 4

Creating threads by extending the Thread class • Define a class, e. g. New. Thread, extending the Thread class • Override the run() method to tell the system how the thread will be executed when it runs. • Create an instance of New. Thread, • Invoke the start() method to tell the system to start the thread and to execute the run() method. 20/12/2021 Client-server Programming 5

Key elements for extending Thread 1 class New. Thread extends Thread { … //override the run method public void run() { //define how the thread runs … } 20/12/2021 Client-server Programming 6

Key element for extending Thread 2 class My. Application { … public void some. Method() { New. Thread mythread=new New. Thread(); … mythread. start(); } … } 20/12/2021 Client-server Programming 7

An example: a thread printing its id repeatedly class My. Thread extends Thread { private String thread. ID; My. Thread(String s) { thread. ID=s; } public void run() { for (int i=0; i<200; i++){ System. out. println("Print thread " + thread. ID); }//for }//run } //My. Thread 20/12/2021 Client-server Programming 8

An example: two threads printing their ids public class Several. Threads { public static void main(String [] args) { My. Thread t 1, t 2; //create threads t 1 = new My. Thread("t 1"); t 2 = new My. Thread("t 2"); //start threads t 1. start(); t 2. start(); }//main }//Several. Threads 20/12/2021 Client-server Programming 9

An example: two threads printing their ids Print Print Print … thread thread thread t 1 t 2 t 1 t 2 Run the Severalthread program in E: TeachingClient_serverRun 2006 -7CodeClient. Server. Package threads 20/12/2021 Client-server Programming 10

Life cycle of a thread • A thread can be in one of these states once it is created: ready, running, blocked, finish • A ready thread is runnable, but not running, it needs allocation of CPU time. • Common ways for a running thread to become blocked include: waiting for I/O, sleep • A common way for a thread to finish is when it completes its execution of the run() method 20/12/2021 Client-server Programming 11

Creating threads by implementing the Runnable interface • Define a class, e. g. New. Task, implementing the Runnable interface • implement the run() method to tell the system how the task will be executed when it runs. • Create an instance of New. Task, e. g. t 1 • The task needs to be executed in a thread. Create an instance of Thread with t 1 as the parameter • Invoke the start() method of the thread to tell the system to start the thread. 20/12/2021 Client-server Programming 12

Key elements for implementing Runnable 1 class New. Task extends implements Runnable … //implement the run public void run() { //define how the … } 20/12/2021 Another. Class { method thread runs Client-server Programming 13

Key elements for implementing Runnable 2 class My. Application { … public void some. Method() { New. Task mytask=new New. Task(); Thread mythread=new Thread(mytask); … mythread. start(); } … } 20/12/2021 Client-server Programming 14

Implementing Runnable or Extending Thread • Use Runnable if need to extend another class • Even if New. Task does not extend another class, this is the preferred method for creating a thread if we only want to define the run() method, and not using the other methods in Thread. 20/12/2021 Client-server Programming 15

An example: thread printing its id using implementing Runnable class My. Task implements Runnable { private String thread. ID; My. Task(String s) { thread. ID=s; } public void run() { for (int i=0; i<200; i++){ System. out. println("Print thread " + thread. ID); }//for }//run } //My. Task 20/12/2021 Client-server Programming 16

An example: two threads printing their ids using implementing Runnable public class Several. Threads { public static void main(String[] args) { //create instances of My. Task t 1 = new My. Task("t 1"); My. Task t 2 = new My. Task("t 2"); // create Thread instances Thread tt 1=new Thread(t 1); Thread tt 2=new Thread(t 2); //start threads tt 1. start(); tt 2. start(); }//main }//Several. Threads 20/12/2021 Client-server Programming 17

Thread synchronisation

Problem with accessing shared resources– an example • The Account class is a bank account, contains methods such as deposit and withdraw. • Cardholder is a thread allows the card holder to deposit £ 10 repeatedly for 10 times. • Family. Account has a main methods that creates one instance of an Account, two instances of Cardholders, both putting money into the same account.

c 1 deposit(10) c 2 An instance of Account deposit(10) Balance=50 deposit(10)

Problem with accessing shared resources– an example 1 class Account { private int balance=0; public void deposit(int amount) { //balance=balance+amount; int tmp = balance; Thread. sleep(200); balance = tmp + amount; System. out. println("Current balance is "+balance); } }

Problem with accessing shared resources – an example 2 class Card. Holder extends Thread{ private Account acc; private String acc. Name; Card. Holder(Account a, String nm) { acc=a; acc. Name=nm; } public void run() { for (int i=0; i<10; i++) { System. out. println(acc. Name+" is depositing £ 10. . . "); acc. deposit(10); } }//run }//Card. Holder

Problem with accessing shared resources– an example 3 class Family. Account { public static void main(String [] args) { Account our. Account=new Account(); Card. Holder c 1 = new Card. Holder(our. Account, "john"); Card. Holder c 2 = new Card. Holder(our. Account, "Kate"); c 1. start(); c 2. start(); } }//Family. Account

Problem with accessing shared resources– an example 4 • Run Family. Account in the E: clientserver/threads (account, cardholder, family. Account) • The result should be: The balance is : £ 10 The balance is : £ 20 The balance is : £ 30 … The balance is : £ 200 • But a shared resource may be corrupted if it is accessed simultaneously by multiple threads

Problem • For example, the current balance in our. Account is £ 50, • The c 1 thread: tries to deposit £ 10; loading the current value, i. e. 50, to the temporary storage place before doing the arithmetic. The thread is suspended; switches to the c 2 thread. • The c 2 thread: tries to deposit £ 10; loading the current balance, which is still £ 50. The thread is then suspended; resumes the c 1 thread, • Back with the c 1 thread: add £ 10 to the value, i. e. £ 50, in the temporary storage; £ 60 is stored in the attribute balance; suspend the c 1 thread • Back with the c 2 thread: the c 2 thread adds £ 10 to the current value in the temporary storage that is 50. The result 60 is now stored in the balance attribute. • Should be 70, not 60!

Race condition • The problem is that the two threads (c 1 and c 2) are accessing the same resource (account) in a way that causes a conflict. • This is a common problem, known as a race condition, in multithreaded programs. • A class is said to be thread-safe if an object of the class does not cause a race condition in the presence of multiple threads. • The Account class is not thread-safe at the moment.

Synchronized method • There is a need to protect the shared data. • Use synchronized methods so that there can be only one thread executing this method at a time. • Java guarantees once a thread has gained access to a synchronized method, it will finish the method before any other thread gains access to that or any other synchronized method in that object. • A synchronised method (implicitly) acquires a lock on the instance.

Deposit as a Synchronized method class Account { int balance=0; public synchronized void deposit(int amount) { int tmp = balance; Thread. sleep(200); balance = tmp + amount; System. out. println("Current balance is "+balance); } }//Account • Run the program family. Account, change the first line of deposit

Multithreading for user interface in GUI applications 20/12/2021 Client-server Programming 29

Example: Flashing label • Press start, program displays a flashing rectangle until user presses the stop button. • One thread is tied to display the flashing rectangle. • In order to be able to accept user’s input, need more than one thread. • Run the Flash. Stop program. (E: TeachingClient_serverRun 20067CodeClient. Serversrcthreads) 20/12/2021 Client-server Programming 30

Implementations • Two classes: Flash. Stop and Flash. Rec • Flash. Stop deals with the graphical interface and the interaction with the user – Presents gui elements (behaves as a Frame) – Implements the acton. Performed method (behaves as an Action. Listener) • To start a thread for displaying the “flashing” • To stop the thread • Flas. Rec deals with displaying the “flashing” effect. – A thread repeatedly sets the background colour to be red/white 20/12/2021 Client-server Programming 31

Flash rectangle 1 class Flash. Rec extends JPanel implements Runnable{ private boolean keepgoing=false; public void run() { while (keepgoing) { try { set. Background(Color. red); Thread. sleep(800); set. Background(Color. white); Thread. sleep(800); } catch (Exception e) {…} }//while }//run To continue… 20/12/2021 Client-server Programming 32

Flash rectangle 2 public void please. Stop() { keepgoing=false; } public void please. Start(){ keepgoing=true; } }//Flash. Rec 20/12/2021 Client-server Programming 33

Flash. Stop class 1 public class Flash. Stop extends JFrame implements Action. Listener { private JButton flash= new JButton(“flash"); private JButton stop=new JButton("stop"); private Flash. Rec fr; private Thread rec. Thread; … 20/12/2021 Client-server Programming 34

Flash. Stop class 2 Flash. Stop() { set. Size(400, 200); fr=new Flash. Rec(); Container c = get. Content. Pane(); c. add(flash, "North"); start. add. Action. Listener(this); c. add(stop, "South"); stop. add. Action. Listener(this); c. add(fr, "Center"); // }//Flash. Stop 20/12/2021 Client-server Programming 35

Flash. Stop class 3 public void action. Performed(Action. Event e) { if (e. get. Source() == start ) { fr. please. Start(); rec. Thread=new Thread(fr); rec. Thread. start(); } if (e. get. Source() ==stop) { fr. please. Stop(); } }//action. Performed The actual code is slightly more complex. 20/12/2021 Client-server Programming 36

Review • Understand how to define and create threads in Java: extends Thread and implement Runnable • Be able to write simple Java thread applications • Problem and solution with concurrent thread • Understand the GUI example and how to deal with events. 20/12/2021 Client-server Programming 37
- Slides: 37