java_base4_thread

上传人:豆浆 文档编号:47430053 上传时间:2018-07-02 格式:PPT 页数:38 大小:662KB
返回 下载 相关 举报
java_base4_thread_第1页
第1页 / 共38页
java_base4_thread_第2页
第2页 / 共38页
java_base4_thread_第3页
第3页 / 共38页
java_base4_thread_第4页
第4页 / 共38页
java_base4_thread_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《java_base4_thread》由会员分享,可在线阅读,更多相关《java_base4_thread(38页珍藏版)》请在金锄头文库上搜索。

1、第6课 多线程n线程的概念n创建和启动线程n线程的调度n多个线程的同步n线程之间的通信参见Java面向对象编程的13章线程的概念n进程是指运行中的应用程序,每一个进程都有 自己独立的内存空间。对一个应用程序可以同 时启动多个进程。例如每次执行JDK的java.exe 程序,就启动了一个独立的Java虚拟机进程, 该进程的任务是解析并执行Java程序代码。n线程是指进程中的一个执行流程,有时也称为 执行情景。一个进程可以由多个线程组成,即 在一个进程中可以同时运行多个不同的线程, 它们分别执行不同的任务。当进程内的多个线 程同时运行,这种运行方式称为并发运行。主线程n每当用java命令启动 一个

2、Java虚拟机进 程,Java虚拟机就 会创建一个主线程 ,该线程从程序入 口main()方法开始执行。 public class Samplepublic 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 Threadpublic void run()for(int a=0;a50;

4、a+)tryThread.sleep(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 Threadpublic void run()for(int a=0;a50;a+)t

5、ryThread.sleep(100);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 Runnableint a=0; /实例变量public void run()for( a=0;a10;a+)tryThread.sleep(1

6、00);catch(Exception e)System.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

7、 mr=new MyRunnable ();Thread t1=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()po

8、p()getName()producer1consumer1producer2producer3runningblockedrunnableblockedStack2对象push()pop()getName()producer4consumer2runnableblocked线程调度因为Java线程的调度不一定是分时的,所以你必须确 保你的代码中的线程会不时地给另外一个线程运行的 机会。有三种方法可以做到一点:n让处于运行状态的线程调用Thread.sleep()方法。n让处于运行状态的线程调用Thread.yield()方法。n让处于运行状态的线程调用另一个线程的join()方法 。线程睡眠

9、:Thread.sleep()方法public class MyThread extends Threadpublic 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();t

10、2.start(); 线程让步:Thead.yield()方法public class MyThread extends Threadpublic 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()pu

11、blic class Machine extends Threadpublic void run()for(int a=0;a10;a+)System.out.println(getName()+“:“+a);public static void main(String args)throws ExceptionMachine machine=new Machine();machine.setName(“m1“);machine.start();System.out.println(“main:join machine“);machine.join(); /主线程等待machine线程运行结束

12、System.out.println(“main:end“); 共享资源的竞争n当多个线程共享一些数据,它们的操作会竞争共享资 源,这会导致一些意想不到的错误。n以一个生产者(Producer),消费者(Consumer)为例, 生产者向一个堆栈(SyncStack )中加入产品,字符消费 者向同一个堆栈中取出产品。nSyncTest类:提供程序入口main()方法,负责创建生产者和消费者线n程,并且启动这些线程。nProducer类:生产者线程,不断向堆栈中加入产品。nConsumer类:消费者线程,不断向堆栈中取出产品。nStack类:堆栈,允许从堆栈中取出或加入产品。参见mythread

13、problemSyncTest.java堆栈Stack.javaclass Stack private 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;buffer0buffer1buf

14、fer2buffer3push()pop()point生产者线程class Producer extends 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.print

15、ln(getName()+ “: push “ + goods +“ to “+theStack.getName();yield(); buffer0=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 “ + goods +“ from “+theStack.getName();yield(); buffer0=goods0buffer1 =goods1buffer2 =goods2buffer3 =goods3point消费者线程创建生产者和消费者线程public class SyncTest public static void main(String args) Stack stac

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号