Top Banner
Threads
36

Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Dec 22, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Threads

Page 2: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Thread = independent flow of control

e.g. a server needs to communicate with manycustomers => each customer is served by aseparate thread

Page 3: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Threads – toy example

increments x

increments y

calls repaint MyApplet

Page 4: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Threads – toy exampleimport java.applet.Applet;import java.awt.*;

public class FirstApplet extends Applet { public int x,y;

public void init() {

....

}

public void paint(Graphics g) { g.setColor(Color.white); g.setFont(new Font("SansSerif",Font.BOLD,32)); g.drawString("x="+x,10,40); g.drawString("y="+y,10,80); g.drawString("x-y="+(x-y),10,120); }}

Page 5: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

public void init() { setBackground(Color.black);

new Thread(new Runnable () { public void run() { while (true) { x++; } }}).start();

new Thread(new Runnable () { public void run() { while (true) { y++; } }}).start();

new Thread(new Runnable () { public void run() { while (true) { try { Thread.currentThread().sleep(40); } catch (InterruptedException e) {}; repaint(); } }}).start(); }

1. create2. start

Page 6: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Runnable interface

run() - method

Thread(Runnable r); a constructorof the Threadclass

Page 7: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Anonymous classesnew Thread(new Runnable () { public void run() { while (true) { y++; } }}).start(); new ClassName() {

{ ? } ?}

instanceinitializer

local variables

Page 8: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Time slicing

Thread 1Thread 2Thread 3Thread 1Thread 2Thread 3Thread 2Thread 3

time

Page 9: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Threads - priorities new Thread(new Runnable () { public void run() { try { Thread.currentThread().setPriority(Thread.MIN_PRIORITY); } catch (IllegalArgumentException e) {} catch (SecurityException e) {}

while (true) { x++; } }}).start();

MyApplet

Page 10: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Synchronization problems

object

Thread 1 Thread 2

Extremely difficult to debug...

Page 11: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Synchronization problems –toy example

x,dx

Thread 1 Thread 2

while (true) { x+=1000; dx=-1; for (i=0;i<1000;i++) x+=dx;}

while (true) { x-=1000; dx=+1; for (i=0;i<1000;i++) x+=dx;}

MyApplet

Page 12: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

public void init() { new Thread(new Runnable () { public void run() { while (true) { x+=1000; dx=-1; for (i=0;i<1000;i++) x+=dx; } }}).start();

new Thread(new Runnable () { public void run() { while (true) { x-=1000; dx=+1; for (i=0;i<1000;i++) x+=dx; } }}).start();

..... }

Synchronization problems –toy example

Page 13: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

synchronized blocks of code

object

Thread 1 Thread 2

Do not touch the object.

Page 14: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

synchronized blocks of codepublic void init() { new Thread(new Runnable () { public void run() { while (true) { synchronized(lock) { x+=1000; dx=-1; for (i=0;i<1000;i++) x+=dx; } } }}).start();

new Thread(new Runnable () { public void run() { while (true) { synchronized(lock) { x-=1000; dx=+1; for (i=0;i<1000;i++) x+=dx; } } }}).start();

} MyApplet

Page 15: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

synchronized blocks of codepublic void init() { new Thread(new Runnable () { public void run() { synchronized(lock) { while (true) { x+=1000; t1++; dx=-1; for (i=0;i<1000;i++) x+=dx; } } }}).start();

new Thread(new Runnable () { public void run() { synchronized(lock) { while(true) { x-=1000; t2++; dx=+1; for (i=0;i<1000;i++) x+=dx; } } }}).start();

} MyApplet

Page 16: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

synchronized methods

synchronized ? method(?) { ?}

? method(?) { synchronized(this) { ? }}

Page 17: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

stop()

deprecated – can leave objects it is manipulating in inconsistent state

pleaseStop()define your own

Page 18: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

wait() and notify()class Pipe { LinkedList l=new LinkedList(); public synchronized void Push(Object o) { l.add(o); this.notify(); } public synchronized Object Pop() { while (l.size()==0) { try { this.wait(); } catch (InterruptedException e) { } } return l.remove(0); }}

Page 19: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Sleeping threadstry { Thread.currentThread().sleep(40);} catch (InterruptedException e) {};

Page 20: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Exceptions

Page 21: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Exceptions

method() some unexpected situation can occur

throw an exception

try { method();} catch (TypeOfTheException e) { // deal with the exception}

Page 22: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Exceptions

try {

} catch (TypeOfTheException e) {

}

Code dealing with “normal” execution

Code dealing with “exceptions”

Page 23: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Exceptions are objectsclass NoElectricityException extends Exception { NoElectricityException() { super(“No electricity!”); } NoElectricityException(String message) { super(message); }}

getMessage() method

Page 24: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Exceptions are objectsClass Chef { ... Food makeRoastBeef(Kitchen k) { if (!k.lightOn()) { k.turnLightOn(); if (!k.lightOn()) throw new NoElectricityException(); ... } ... }}

Page 25: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Exceptions are objects

Food[] prepareDinner() { try { f=makeRoastBeef(k); } catch (NoElectricityException e) { ? }}

Page 26: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Exceptions

Throwable

Exception Error

RuntimeException

checked unchecked

Page 27: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Exceptions examplesInterruptedException.........RuntimeException ArithmeticException IndexOutOfBoundException ArrayIndexOutOfBoundException NullPointerException ...........

Error OutOfMemoryError ............

Page 28: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

ThrowsFood makeRoastBeef(Kitchen k) throws NoElectricityException, NoMeatException,... { ...

}

checked exceptions

Page 29: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

try/catch/finallytry {

}catch (TypeOfTheException e){

}finally {

}

Page 30: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

try { System.out.println(“1”); if (x==0) throw(new MyException());}catch (MyException e){ System.out.println(“3”);}finally { System.out.println(“2”);}

EXERCISE: what will bethe ouput for a) x=1 b) x=0

Page 31: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

void Test(int x) throws YourException { try { System.out.println(“1”); if (x==0) throw(new MyException()); if (x==1) throw(new YourException()); if (x==2) return; System.out.println(“4”); } catch (MyException e){ System.out.println(“3”); } finally { System.out.println(“2”); }}void MyTest(int y) { try { System.out.prinln(“6”); Test(y); System.out.println(“7”); } catch (YourException e) { System.out.println(“5”); }} EXERCISE:

what will bethe ouput for a) MyTest(0); b) MyTest(1); c) MyTest(2); d) MyTest(3);

Page 32: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Applets cont.

Page 33: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Applet parameters<APPLET CODE=“MyApplet.class" WIDTH="200" HEIGHT="200"> <PARAM NAME=“BALLS” VALUE=50> <PARAM NAME=“MINDIAM” VALUE=20><PARAM NAEM=“MAXDIAM” VALUE=50></APPLET>

....balls=Integer.parseInt(getParameter(“BALLS"));....

BouncingBallBouncingBall

Page 34: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Why is it flickering?

“repaint” threadrepaintrequests

update() clears screen

calls paint()

Page 35: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

Double buffering

“repaint” threadrepaintrequests

update() calls paint()

clears second-screendraws everything on the second-screencopies second-screen to the screen

Page 36: Threads. Thread = independent flow of control e.g. a server needs to communicate with many customers => each customer is served by a separate thread.

BouncingBall revisited Image offscreenImage; Graphics offscreenGraphics;

offscreenImage = createImage(width,height); offscreenGraphics = offscreenImage.getGraphics();

offscreenGraphics.setColor(Color.black); offscreenGraphics.fillRect(0,0,width,height);

g.drawImage(offscreenImage, 0, 0, this);

BouncingBallBouncingBall