黑马程序员技术交流社区

标题: 开启线程的两种方式 [打印本页]

作者: yaodd321    时间: 2014-8-28 01:01
标题: 开启线程的两种方式
  要学习线程,首先要了解什么是线程。线程,就是就是进程中一个负责程序执行的控制单元,一个进程可以多执行路径,称为为多线程。一个进程中至少有一个线程,开启多个线程是为了同时运行多部分代码,也就是线程要执行的任务。开启多线程有利有弊,好处是解决了多部分同时运行的问题;弊端是线程太多会降低执行的效率。有一个小的知识点需要注意,JVM启动时就启动了多个线程,至少有两个线程可以分析出来, 执行main函数的线程和负责垃圾回收的线程。
  创建线程的目的是为了开启一条执行路径,使指定的代码和其他代码实现同时运行,而运行的指定代码就是这个执行路径的任务。Thread类用于描述线程任务,线程是需要任务的,Thread类也就是对任务的描述。Thread类中封装了run方法,线程任务就是通过run方法来体现的。也就是说,run方法就是封装自定义线程运行任务的函数。总结就是,开启线程就是为了运行指定代码,所以只有继承Thread类,并复写飞run方法,将运行的代码放在run方法中即可。
  如何创建一个线程,有两种方式:一是继承Thread类,一是实现Runnable接口。
  第一种方式很好理解,定义一个类继承Thread类,覆盖其中的run方法,常见子类对象,然后开启线程即可。
01 class A extends Thread
02 {
03     A(){}//构造函数初始化
04     void run()//覆盖父类中的方法
05     {}
06
07 }
08 class ThreadDemo
09 {
10     public static void main(String[] args)
11         A a = new A();//创建Thread类子类对象
12         a.start();//开启线程
13 }
  第二种方式,首先定义类实现Runnable接口并覆盖接口中的run方法,将线程任务封装在run方法中。因为Thread类有Thread(Runnable target)构造方法,所以可以通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类构造方法的参数进行传递。最后调用线程对象的start方法开启线程。
01 class A implements Runnable
02 {
03     A(){}
04     void run(){}//覆盖Runnable接口的run方法
05
06 }
07
08 class RunnableDemo
09 {
10     public static void main(String[] args)
11         A a = new A();//将线程任务封装成对象
12         Thread t = new Thread(a);//创建线程
13         Thread t2 = new Thread(a);
14         t.start();//开启线程
15         t2.start();
16
17 }
通过比较两种方法,通过实现Runnable接口的方法创建线程更好。因为其将线程任务从线程的子类中分离出来,进行了单独的封装。同时避免了java单继承的局限性。

作者: 不服™け你咬我    时间: 2014-8-28 01:13
多谢赐教,,我今天开始学这个,,嘻嘻




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2