孙卫琴《Java面向对象编程》配套PPT--java_base4_thread.ppt
《孙卫琴《Java面向对象编程》配套PPT--java_base4_thread.ppt》由会员分享,可在线阅读,更多相关《孙卫琴《Java面向对象编程》配套PPT--java_base4_thread.ppt(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6课课 多线程多线程n线程的概念n创建和启动线程n线程的调度n多个线程的同步n线程之间的通信 参见Java面向对象编程的13章线程的概念n进程是指运行中的应用程序,每一个进程都有自己独立的内存空间。对一个应用程序可以同时启动多个进程。例如每次执行JDK的java.exe程序,就启动了一个独立的Java虚拟机进程,该进程的任务是解析并执行Java程序代码。n线程是指进程中的一个执行流程,有时也称为执行情景。一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,它们分别执行不同的任务。当进程内的多个线程同时运行,这种运行方式称为并发运行。主线程n每当用java命令启动一个Jav
2、a虚拟机进程,Java虚拟机就会创建一个主线程,该线程从程序入口main()方法开始执行。public class Sample public void method1(String str)System.out.println(str);public void method2(String str)method1(str);public static void main(String args)Sample s=new Sample();s.method2(hello);main()方法method1()方法method2()方法主线程的方法调用栈线程的创建和启动线程的创建和启动(1)定义一
3、个Thread类的子类,覆盖Thread类的run()方法,然后创建该子类的实例。参见MyThread.java(2)定义一个实现Runnable接口的类,实现它的run()方法,然后将这个类的实例作为Thread的构造方法的参数,创建Thread类的实例。参见MyRunnable.java(3)调用start()方法启动线程。比如,MyThread t=new MyThread();t.start();创建Thread类的子类public class MyThread extends Thread public void run()for(int a=0;a50;a+)tryThread.s
4、leep(100);catch(Exception e)System.out.println(Thread.currentThread().getName()+a);public static void main(String args)MyThread t1=new MyThread();MyThread t2=new MyThread();t1.start();t2.start();区分主线程和用户定义的线程public class MyThread extends Thread public void run()for(int a=0;a50;a+)tryThread.sleep(100
5、);catch(Exception e)System.out.println(Thread.currentThread().getName()+a);public static void main(String args)MyThread t1=new MyThread();t1.start();t1.run();实现Runnable接口public class MyRunnable implements Runnable int a=0;/实例变量 public void run()for(a=0;a10;a+)tryThread.sleep(100);catch(Exception e)S
6、ystem.out.println(Thread.currentThread().getName()+a);public static void main(String args)MyRunnable mr=new MyRunnable();Thread t1=new Thread(mr);/Thread(Runnable r)Thread t2=new Thread(mr);t1.start();t2.start();实现Runnable接口public static void main(String args)MyRunnable mr=new MyRunnable();Thread t1
7、=new Thread(mr);Thread t2=new Thread(mr);t1.start();t2.start();public static void main(String args)MyRunnable mr1=new MyRunnable();MyRunnable mr2=new MyRunnable();Thread t1=new Thread(mr1);Thread t2=new Thread(mr2);t1.start();t2.start();线程状态转换 线程状态转换Stack1对象push()pop()getName()producer1consumer1prod
8、ucer2producer3runningblockedrunnableblockedStack2对象push()pop()getName()producer4consumer2runnableblocked线程调度 因为Java线程的调度不一定是分时的,所以你必须确保你的代码中的线程会不时地给另外一个线程运行的机会。有三种方法可以做到一点:n让处于运行状态的线程调用Thread.sleep()方法。n让处于运行状态的线程调用Thread.yield()方法。n让处于运行状态的线程调用另一个线程的join()方法。线程睡眠:Thread.sleep()方法public class MyThre
9、ad extends Thread public void run()for(int a=0;a50;a+)tryThread.sleep(100);catch(InterruptedException e)System.out.println(Thread.currentThread().getName()+a);public static void main(String args)MyThread t1=new MyThread();MyThread t2=new MyThread();t1.start();t2.start();线程让步:Thead.yield()方法public cl
10、ass MyThread extends Thread public void run()for(int a=0;a50;a+)yield();System.out.println(Thread.currentThread().getName()+a);public static void main(String args)MyThread t1=new MyThread();MyThread t2=new MyThread();t1.start();t2.start();等待其他线程结束:等待其他线程结束:join()public class Machine extends Thread p
11、ublic void run()for(int a=0;a10;a+)System.out.println(getName()+:+a);public static void main(String args)throws Exception Machine machine=new Machine();machine.setName(m1);machine.start();System.out.println(main:join machine);machine.join();/主线程等待machine线程运行结束 System.out.println(main:end);共享资源的竞争n当多
12、个线程共享一些数据,它们的操作会竞争共享资源,这会导致一些意想不到的错误。n以一个生产者(Producer),消费者(Consumer)为例,生产者向一个堆栈(SyncStack)中加入产品,字符消费者向同一个堆栈中取出产品。nSyncTest类:提供程序入口main()方法,负责创建生产者和消费者线n程,并且启动这些线程。nProducer类:生产者线程,不断向堆栈中加入产品。nConsumer类:消费者线程,不断向堆栈中取出产品。nStack类:堆栈,允许从堆栈中取出或加入产品。参见mythreadproblemSyncTest.java堆栈Stack.javaclass Stack pr
13、ivate String name;private String buffer=new String100;int point=-1;public String pop()String goods=bufferpoint;bufferpoint=null;Thread.yield();point-;return goods;public void push(String goods)point+;Thread.yield();bufferpoint=goods;buffer0buffer1buffer2buffer3push()pop()point生产者线程class Producer ext
14、ends Thread private Stack theStack;public Producer(Stack s,String name)super(name);theStack=s;start();/启动自身生产者线程 public void run()String goods;for(int i=0;i 200;i+)goods=goods+(theStack.getPoint()+1);theStack.push(goods);System.out.println(getName()+:push +goods+to+theStack.getName();yield();buffer0
15、=goods0buffer1=goods1buffer2=goods2buffer3=goods3point生产者线程消费者线程class Consumer extends Thread private Stack theStack;public Consumer(Stack s,String name)super(name);theStack=s;start();/启动自身消费者线程 public void run()String goods;for(int i=0;i 200;i+)goods=theStack.pop();System.out.println(getName()+:pop
16、 +goods+from+theStack.getName();yield();buffer0=goods0buffer1=goods1buffer2=goods2buffer3=goods3point消费者线程创建生产者和消费者线创建生产者和消费者线程程public class SyncTest public static void main(String args)Stack stack=new Stack(stack1);Producer producer1=new Producer(stack,producer1);Consumer consumer1=new Consumer(sta
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java面向对象编程 孙卫琴 Java 面向 对象 编程 配套 PPT java_base4_thread
限制150内