第15章 线程 线程入门 同步化议题 concurrent套件新增类别
第15章 • 线程 – 线程入门 – 同步化议题 – concurrent套件新增类别
继 THRead 继承 java. lang. Thread类别,并重新定义 run方法 实例化您自定义的 Thread类另 °使用 start0方法后动线程
继承Thread • 继承java.lang.Thread类别,并重新定义 run()方法 • 实例化您自定义的Thread类别 • 使用start()方法启动线程
继承 Thread public class Eraser Threadextends Thread i private boolean activei private string maski //重新定义run()方法 public void run ( while (isactiveo) i System. out.print(mask)i try i //暂停目前的线程50毫秒 Thread currentThread().sleep(50) catch(InterruptedException e) t e printstackTrace()i
继承Thread public class EraserThreadextends Thread { private boolean active; private String mask; … //重新定义run()方法 public void run () { while(isActive()) { System.out.print(mask); try { //暂停目前的线程50毫秒 Thread.currentThread().sleep(50); } catch(InterruptedException e) { e.printStackTrace(); } } } }
继 Thread //后动 Eraser线程 EraserThread eraserThread new EraserThread('#')i eraserThread. start()i String password scannernext()i eraserThread. setActive(false) 在 Java se6中可以使用 System. console 来取得 Java.O. Console物件 使用 Console物件的 read Password(Q方法 就可以避免输人的密码被窥视的问题
继承Thread //启动Eraser线程 EraserThread eraserThread = new EraserThread('#'); eraserThread.start(); String password = scanner.next(); eraserThread.setActive(false); • 在Java SE 6中可以使用System.console() 来取得java.io.Console物件 • 使用Console物件的readPassword()方法, 就可以避免输入的密码被窥视的问题
实作 Runnable.界面 如果您的类别经要继承某个类别,那 您就不能继承 Thread类别 继承了 Thread类别,您就不能再继承其它 类别 实侑 java. lang. Runnable接口来定义具线程 功能的类别 Runnable接口中定义一个run0方法要实作 在实例化一个 Thread对象时,可以传入 实作 Runnable接口的对象作为自变量
实作Runnable界面 • 如果您的类别已经要继承某个类别,那么 您就不能继承Thread类别 • 继承了Thread类别,您就不能再继承其它 类别 • 实作java.lang.Runnable接口来定义具线程 功能的类别 • Runnable接口中定义一个run()方法要实作 • 在实例化一个Thread对象时,可以传入一 个实作Runnable接口的对象作为自变量
实作 Runnable.界面 public class EraserimplementsRunnable //SE1FRunnable private boolean active private string maski //重新定义run()方法 public void run ()i while (isactiveo) System. out. print(mask) try //暂停目前的线程50毫秒 Thread currentThread().sleep(50)i catch(InterruptedException e)t e printstackTrace()i
实作Runnable界面 public class EraserimplementsRunnable { //实作Runnable private boolean active; private String mask; … //重新定义run()方法 public void run () { while(isActive()) { System.out.print(mask); try { //暂停目前的线程50毫秒 Thread.currentThread().sleep(50); } catch(InterruptedException e) { e.printStackTrace(); } } } }
实作 Runnable.界面 // Eraser实作 Runnable界面 Eraser eraser new eraser(#i)i //后动 Eraser线程 Thread eraser Thread new Thread (eraser)i eraserThread. start oi String password scanner next()i eraser. setActive(false)i
实作Runnable界面 //Eraser实作Runnable界面 Eraser eraser = new Eraser('#'); //启动Eraser线程 Thread eraserThread = new Thread(eraser); eraserThread.start(); String password = scanner.next(); eraser.setActive(false);
Daemon线程 个 Daemon线程是一个在背景执行服务的 线程 如果所有的 Daemon的线程都结束了,则 Daemon线程自动就会终止 从Main方法开始的是一个非 Daemon线程 如果希望某个线程在产生它的线程结束后 跟着终止’要捋它设为 Daemon线程
Daemon线程 • 一个Daemon线程是一个在背景执行服务的 线程 • 如果所有的非Daemon的线程都结束了,则 Daemon线程自动就会终止 • 从Main方法开始的是一个非Daemon线程 • 如果希望某个线程在产生它的线程结束后 跟着终止,要将它设为Daemon线程
Daemon线程 使用 setDaemono方法来设定一个线程是否 为 Daemon线程 预设所有从 Daemon线程产生的线程也是 Daemon线程 Thread thread new Thread //这是匿名类别的写法 new Runnable( public void run( while(true System. out. print("T) //设定为 Daemon线程 thread. setDaemon( true) thread. startoi
Daemon线程 Thread thread = new Thread( //这是匿名类别的写法 new Runnable() { public void run() { while(true) { System.out.print("T"); } } }); //设定为Daemon线程 thread.setDaemon(true); thread.start(); • 使用setDaemon()方法来设定一个线程是否 为Daemon线程 • 预设所有从Daemon线程产生的线程也是 Daemon线程
线程生命周期 执行 start0之后,线程进入 Runnable状态 此时线程尚未真正开始执行 ·必须等待排班器( Scheduler)的排班 Dead new Thread Unblocked Blocked Blocked事件 run()執行完畢 執行 start) Runnable Running 排班器
线程生命周期 • 执行start()之后,线程进入Runnable状态, 此时线程尚未真正开始执行 • 必须等待排班器(Scheduler)的排班