第七讲多线程(编辑修改稿)内容摘要:

private boolean timeToQuit = false; public void run() { while( !timeToQuit ) {…} } public void stopRunning() { timeToQuit = true。 } } 线程的生命周期及控制 public class ControlThread { private Xyz r = new Xyz()。 private Thread t = new Thread(r)。 public void startThread() { ()。 } publi void stopThread() { ()。 } } 线程的生命周期及控制  isAlive()方法: 可以用来判断线程目前是否正在执行中。 如果线程已被启动并且未被终止,那么 isAlive( )返回 true,但该线程是可运行或是不可运行的,是不能作进一步的分辨。 如果返回 false,则该线程是新创建或是已被终止的(同样不能作进一步的分辨)。  join()方法: 等待线程执行完毕。  yield()方法: 将执行的权力交给其它优先级相同的线程,当前执行线程到可运行线程队列( ready)的最后等待,若队列空,该方法无效。 myThread thd = new MyThread()。 ()。 … ()。 //等待线程 thd执行完后再继续往下执行 … join(int time):最多等待 time所指定的时间。  sleep()方法可以暂停线程的执行,让其它线程得到机会。 但 sleep()要丢出例外 InterruptedException ,必须抓住。 try { sleep(100) }catch(InterruptedException e){ …// 本例外可不作处理 }  suspend()方法和 resume()可以用来暂停线程或恢复线程。 可以由线程自身在线程体中调用 suspend()方法暂停自己,也可以在其他线程中通过线程实例调用 suspend()方法暂停线程的执行。 但是要恢复由 suspend()方法暂停的线程,只能在其他线程中通过线程实例调用 resume()方法。 线程的生命周期及控制 Java提供一个线程调度器来监控程序中启动后进入可运行状态的所有线程。 线程调度器按照线程的 优先级 决定调度哪些线程来执行,具有高优先级的线程会在较低优先级的线程之前得到执行。 同时线程的调度是 抢先式 的,即如果当前线程在执行过程中,一个具有更高优先级的线程进入可执行状态,则该告优先级的线程会被立即调度执行。 多个线程运行时,若线程的优先级相同,由操作系统按时间片轮转 方式或 独占方式 来分配线程的执行时间。 线程的优先级及调度 在 Java中线程的优先级是用数字来表示的,分为三个级别:  低优先级: ,数值为 1 (2~4)  缺省优先级: Thread. NORM_PRIORITY,数值为 5  高优先级: ,数值为 10 (6~9) 具有相同优先级的多个线程,若它们都为高优先级,则每个线程都是独占式的,也就是说这些线程将被顺序执行;若该优先级不为高优先级,则这些线程将同时执行,也就是说这些线程的执行是无序的。 线程被创建后,其缺省的优先级是缺省优先级 Thread. NORM_PRIORITY。 可以用方法 int getPriority()来获得线程的优先级,同时也可以用方法 void setPriority( int p ) 在线程被创建后改变线程的优先级。 线程的优先级及调度 线程的优先级及调度  线程离开执行状态, 如果:  线程结束  线程处于 I/O等待  线程调用 sleep  线程调用 wait  线程调用 join  线程调用 yield  有更高优先级的线程  时间片用完 Priority 10 Priority 9 Priority 8 Priority 7 Priority 6 Priority 5 Priority 4 Priority 3 Priority 2 Priority 1 A B C D E F G H I J K 1. 用管道流实现线程间的通信 线程 1 PipedOutputStream PipedInputStream 输出流 outStream 输入流 inStream 线程 2 2. 通过一个中间类在线程间传递信息 线程 2 线程 1 中间类 m s s (s) s=() write() read() 多线程的互斥与同步 —— 线程间的通信 管道流可以连接两个线程间的通信。 下面的例子里有两个线程在运行,一个写线程往管道流中输出信息,一个读线程从管道流中读入信息。 多线程的互斥与同步 —— 线程间的通信 主类 Pipethread 辅类myWriter 线 程 类 辅类 myReader 线 程 类 管 道 流 将数据写到输出流 从输入流中读数据 输出流作为参数 传给 myWriter 输入流作为参数 传给 myReader class myWriter extends Thread { private PipedOutputStream outStream。 //将数据输出 private String messages[] = { Monday, Tuesday , Wednsday, Thursday,Friday, Saturday, Sunday }。 public myWriter(PipedOutputStream o) { outStream = o。 } public void run() { PrintStream p = new PrintStream( outStream )。 for( int i = 0。 i。 i++) { ( messages[i] )。 ()。 (Write: + messages[i] )。 } ()。 p = null。 } } class myReader extends Thread { private PipedInputStream inStream。 //从中读数据 public myReader(PipedInputStream i) { inStream = i。 } public void run() { String line。 DataInputStream d。 boolean reading = true。 d = new DataInputStream( inStream )。 while( reading amp。 amp。 d != null) { try{ line = ()。 if( line != null ) ( ”Read: + line )。 else reading = false。 }catch( IOException e){} } try{ ().sleep( 4000 )。 }catch( InterruptedException e ){} } } public class Pipethread { public static void main(String args[])。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。