欢迎来到天天文库
浏览记录
ID:52240591
大小:111.56 KB
页数:6页
时间:2020-03-25
《Java 多线程编程详解.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、资料来源于网络PDF版本由fantasybob制作Java多线程编程详解我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切!真是神奇!Java是如何做到这一点的?通过类!作为一个完全面向对象的语言,Java提供了类java.lang.Thread来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程,我们以后的讨论都将围绕这个类进行。那么如何提供给Java我们要线程执行的代码呢?让我们来看一看Th
2、read类。Thread类最重要的方法是run(),它为Thread类的方法start()所调用,提供我们的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它!方法一:继承Thread类,覆盖方法run()我们在创建的Thread类的子类中重写run(),加入线程所要执行的代码即可。下面是一个例子:publicclassMyThreadextendsThread{intcount=1,number;publicMyThread(intnum){number=num;System.out.printl
3、n("创建线程"+number);}publicvoidrun(){while(true){System.out.println("线程"+number+":计数"+count);if(++count==6)return;}}publicstaticvoidmain(Stringargs[]){for(inti=0;i<5;i++)newMyThread(i+1).start();}}这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自App
4、let类),则无法再继承Thread类,这时如果我们又不想建立一个新的类,应该怎么办呢?我们不妨来探索一种新的方法:我们不创建Thread类的子类,而是直接使用它,那么我们只能将我们的方法作为参数传递给Thread类的实例,有点类似回调函数。但是Java没有指针,我们只能传递一个包含这个方法的类的实例。那么如何限制这个类必须包含这一方法呢?当然是使用接口!(虽然抽象类也可满足,但是需要继承,而我们之所以要采用这种新方法,不就是为了避免继承带来的限制吗?)Java提供了接口java.lang.Runnabl
5、e来支持这种方法。资料来源于网络PDF版本由fantasybob制作方法二:实现Runnable接口Runnable接口只有一个方法run(),我们声明自己的类实现Runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是Runnable接口并没有任何对线程的支持,我们还必须创建Thread类的实例,这一点通过Thread类的构造函数publicThread(Runnabletarget);来实现。下面是一个例子:publicclassMyThreadimplementsR
6、unnable{intcount=1,number;publicMyThread(intnum){number=num;System.out.println("创建线程"+number);}publicvoidrun(){while(true){System.out.println("线程"+number+":计数"+count);if(++count==6)return;}}publicstaticvoidmain(Stringargs[]){for(inti=0;i<5;i++)newThread(n
7、ewMyThread(i+1)).start();}}严格地说,创建Thread子类的实例也是可行的,但是必须注意的是,该子类必须没有覆盖Thread类的run方法,否则该线程执行的将是子类的run方法,而不是我们用以实现Runnable接口的类的run方法,对此大家不妨试验一下。使用Runnable接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装,它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接
8、用多个类分别继承Thread来得紧凑。综上所述,两种方法各有千秋,大家可以灵活运用。下面让我们一起来研究一下多线程使用中的一些问题。三:线程的七种状态下面为线程中的7中非常重要的状态:(有的书上也只有认为前五种状态:而将“锁池”和“等待池”都看成是“阻塞”状态的特殊情况:这种认识也是正确的,但是将“锁池”和“等待池”单独分离出来有利于对程序的理解)1.初始状态,线程创建,线程对象调用start()方法。资料来源于网络PDF版本
此文档下载收益归作者所有