《java培训第九章线程.ppt》由会员分享,可在线阅读,更多相关《java培训第九章线程.ppt(23页珍藏版)》请在三一办公上搜索。
1、第9章 线程,9.1基本概念9.2Java线程9.3线程状态9.4线程优先级9.5线程同步,什么是进程?进程就是一个在内存中独立运行的程序,有自己的地址空间。“多任务”:指操作系统能同时运行多个进程(程序)。如WIN2K系统可以同时运行写字板程序、画图程序、WORD、EXCEL等。线程:是进程内部单一的一个顺序控制流。,9.1 基本概念,文件,输入输出装置,各种系统资源,数据区段,程序区段,只有一个地方在执行,文件,输入输出装置,各种系统资源,程序区段,同时有数个地方在执行,传统的进程,多线程的任务,多线程,多线程的优势减轻编写交互频繁、涉及面多的程序的困难。程序的吞吐量会得到改善。有多个处理
2、器的系统,可以并发运行不同的线程。(否则,任何时刻只有一个线程在运行),关系:一个进程包含一个或多个线程,JAVA线程的概念模型虚拟的CPU,由java.lang.Thread类封装和虚拟 CPU所执行的代码,传递给Thread类对象。CPU所处理的数据,传递给Thread类对象。,代 码,数 据,虚拟CPU,Java线程模型,线程体 Java的线程是通过java.lang.Thread类来实现的。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体(即线程的可执行代码)。,主线程在任何Java程序启动时,一个线程立刻运行(即mian方法对应的
3、线程),该线程通常称为程序的主线程。主线程的特点:它是产生其他子线程的线程。它不一定是最后完成执行的线程,子线程可能在它结束之后还在运行。,创建线程方法(两种)声明一个 Thread 类的子类,并覆盖 run()方法。class mythread extends Thread public void run()/*覆盖该方法*/声明一个实现 Runnable 接口的类,并实现 run()方法。class mythread implements Runnable public void run()/*实现该方法*/用start()方法启动线程:Thread t1=new Thread();T1.
4、start();,9.2 Java线程,public class TestThread/主类用于执行程序,不扩展Thread类 public static void main(String args)Thread t=new MyThread();/创建线程对象 t.start();/启动线程t,它会自动调用run方法 class MyThread extends Thread/线程类,必须扩展Thread类 public void run()/线程对象的可执行代码for(int i=0;i5;i+)System.out.println(SubThread:+i);,(1)继承Thread类,
5、(2)实现Runnable接口,class HelloRunner implements Runnable int i;public void run()i=0;while(true)System.out.println(Hello+i+);if(i=50)break;,class TestRunnerpublic static void main(String args)HelloRunner r=new HelloRunner();Thread t=new Thread(r);t.start();,扩展,public static void main(String args)HelloRu
6、nner r=new HelloRunner();Thread t1=new Thread(r);Thread t2=new Thread(r);t1.start();t2.start();,思考:两种定义线程的方法中,哪一种更常用?,线程共有下面4种状态:new(新建):当你用new创建一个线程时,该线程尚未运行。runnable(可运行):一旦调用了start方法,该线程便是一个可运行的线程。可运行的线程可以尚未执行,也可以正在执行,取决于线程调度的结果blocked(被中断运行):当出现下列操作之一时,线程便进入中断状态:有人调用该线程的sleep()方法;该线程调用了wait()方法;
7、该线程调用了一个在输入输出时中断的操作,也就是说,在输入和输出操作完成之前,该操作不会返回到它的调用程序;该线程试图锁定一个当前被另一个线程锁定了的对象dead(死亡):由于下面两个原因,线程将变成死线程:由于run方法的正常退出而自然死亡;没有捕获到的异常事件终止了run方法的执行,从而导致线程突然死亡;,9.3线程的状态,线程的状态转移,线程常用方法,import java.util.*;public class TestSleep public static void main(String args)MyThread thread=new MyThread();thread.start
8、();try Thread.sleep(5000);catch(InterruptedException e)thread.interrupt();class MyThread extends Thread public void run()while(true)System.out.println(=+new Date();try Thread.sleep(1000);catch(InterruptedException e)return;,sleep()与interrupt(),join()方法,public class TestJoin public static void main(S
9、tring args)MyThread1 thread1=new MyThread1(t1);thread1.start();try thread1.join();catch(InterruptedException e)for(int i=1;i=5;i+)System.out.println(i am main thread);class MyThread1 extends Thread MyThread1(String s)super(s);public void run()for(int i=1;i=5;i+)System.out.println(i am+getName();try
10、Thread.sleep(1000);catch(InterruptedException e)return;,yield()方法,public class TestYield public static void main(String args)MyThread2 t1=new MyThread2(t1);MyThread2 t2=new MyThread2(t2);t1.start();t2.start();class MyThread2 extends Thread MyThread2(String s)super(s);public void run()for(int i=1;i=5
11、0;i+)System.out.println(getName()+:+i);if(i%10=0)yield();,下述方法可以对优先级进行操作:(线程的优先级高,运行的机会多)int getPriority();/得到线程的优先级void setPriority(int newPriority);/当线程被创建后,可通过此方法改变线程的优先级,9.4线程的优先级,class ThreadTestpublic static void main(String args)Thread t1=new MyThread(“T1”);t1.setPriority(Thread.MIN_PRIORITY)
12、;t1.start();Thread t2=new MyThread(“T2”);t2.setPriority(Thread.MAX_PRIORITY);t2.start();Thread t3=new MyThread(“T3”);t3.setPriority(Thread.MAX_PRIORITY);t3.start();,class MyThread extends Thread String message;MyThread(String message)this.message=message;public void run()for(int i=0;i3;i+)System.out
13、.println(message+getPriority();,优先级的例子:,9.5 线程同步,为何同步?线程可以共享数据多个线程访问同一个对象,访问同一个方法,修改该对象的属性,锁标志:与每个对象相关联的标志synchronized使用该关键字与对象锁标志交互线程调用synchronized方法时,对象转入“锁定”状态保护机制:加锁标志、释放锁标志,public void push(char c)synchronized(this)dataidx=c;idx+;,public synchronized void push(char c)dataidx=c;idx+;,说明:普通方法访问前不需要得到锁标志,实例:TestCommonMethod.java,9.6 线程交互,生产者-消费者问题wait方法(Object类)当前对该对象访问的线程wait,释放对象的锁,并被放入该对象的等待池;只有得到对象锁的线程才能调用wait,因此调用wait的语句必须位于synchronized语句块中;由其他线程调用notify/notifyAll方法唤醒notify:唤醒一个正在wait的线程notifyAll:唤醒所有的正在wait的线程,
链接地址:https://www.31ppt.com/p-5371335.html