黑马程序员技术交流社区
标题: 线程疑惑 [打印本页]
作者: 史龙贤 时间: 2012-9-14 01:20
标题: 线程疑惑
方式一:用Thread类创建线程
classMyThreadextendsThread{
publicvoidrun(){
/*覆盖该方法*/
}
}
当使用继承创建线程,这样启动线程:
newMyThread().start();
方式二:用Runable类创建线程
声明为一个实现Runnable接口的类,并
classMyThreadimplementsRunnable{
publicvoidrun(){
/*实现该方法*
}
}
当
newThread(newMyThread()).start();
疑问:请问这两种创建进程的方式有什么区别呢?为什么要这样来做呢?
作者: 覃宏海 时间: 2012-9-14 01:43
Thread是需要继承的 Runnable需要实现
在java中,只支持单继承,因此如果你需要创建多线程的同时又需要继承某个父类,那么Thread就不够用了
但是在java中是支持多继承的,因此在上述情况下就可以同过继承一个父类的同时实现Runnable接口来完成多线程。
他们的区别就在于:Thread是继承;Runnable是实现
作者: 吴通 时间: 2012-9-14 05:50
Java中线程的创建有两种方式:
1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中
2. 通过实现Runnable接口,实例化Thread类
在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果。
Java代码
- package com.threadtest;
- class MyThread extends Thread{
-
- private int ticket = 10;
- private String name;
- public MyThread(String name){
- this.name =name;
- }
-
- public void run(){
- for(int i =0;i<500;i++){
- if(this.ticket>0){
- System.out.println(this.name+"卖票---->"+(this.ticket--));
- }
- }
- }
- }
- public class ThreadDemo {
-
-
- public static void main(String[] args) {
- MyThread mt1= new MyThread("一号窗口");
- MyThread mt2= new MyThread("二号窗口");
- MyThread mt3= new MyThread("三号窗口");
- mt1.start();
- mt2.start();
- mt3.start();
- }
-
- }
package com.threadtest;class MyThread extends Thread{ private int ticket = 10; private String name; public MyThread(String name){ this.name =name; } public void run(){ for(int i =0;i<500;i++){ if(this.ticket>0){ System.out.println(this.name+"卖票---->"+(this.ticket--)); } } }}public class ThreadDemo { public static void main(String[] args) { MyThread mt1= new MyThread("一号窗口"); MyThread mt2= new MyThread("二号窗口"); MyThread mt3= new MyThread("三号窗口"); mt1.start(); mt2.start(); mt3.start(); }}
运行结果如下:
Java代码
- 一号窗口卖票---->10
- 一号窗口卖票---->9
- 二号窗口卖票---->10
- 一号窗口卖票---->8
- 一号窗口卖票---->7
- 一号窗口卖票---->6
- 三号窗口卖票---->10
- 一号窗口卖票---->5
- 一号窗口卖票---->4
- 一号窗口卖票---->3
- 一号窗口卖票---->2
- 一号窗口卖票---->1
- 二号窗口卖票---->9
- 二号窗口卖票---->8
- 三号窗口卖票---->9
- 三号窗口卖票---->8
- 三号窗口卖票---->7
- 三号窗口卖票---->6
- 三号窗口卖票---->5
- 三号窗口卖票---->4
- 三号窗口卖票---->3
- 三号窗口卖票---->2
- 三号窗口卖票---->1
- 二号窗口卖票---->7
- 二号窗口卖票---->6
- 二号窗口卖票---->5
- 二号窗口卖票---->4
- 二号窗口卖票---->3
- 二号窗口卖票---->2
- 二号窗口卖票---->1
一号窗口卖票---->10一号窗口卖票---->9二号窗口卖票---->10一号窗口卖票---->8一号窗口卖票---->7一号窗口卖票---->6三号窗口卖票---->10一号窗口卖票---->5一号窗口卖票---->4一号窗口卖票---->3一号窗口卖票---->2一号窗口卖票---->1二号窗口卖票---->9二号窗口卖票---->8三号窗口卖票---->9三号窗口卖票---->8三号窗口卖票---->7三号窗口卖票---->6三号窗口卖票---->5三号窗口卖票---->4三号窗口卖票---->3三号窗口卖票---->2三号窗口卖票---->1二号窗口卖票---->7二号窗口卖票---->6二号窗口卖票---->5二号窗口卖票---->4二号窗口卖票---->3二号窗口卖票---->2二号窗口卖票---->1
通过实现Runnable接口的代码如下:
Java代码
- package com.threadtest;
- class MyThread1 implements Runnable{
- private int ticket =10;
- private String name;
- public void run(){
- for(int i =0;i<500;i++){
- if(this.ticket>0){
- System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
- }
- }
- }
- }
- public class RunnableDemo {
-
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- //设计三个线程
- MyThread1 mt = new MyThread1();
- Thread t1 = new Thread(mt,"一号窗口");
- Thread t2 = new Thread(mt,"二号窗口");
- Thread t3 = new Thread(mt,"三号窗口");
- // MyThread1 mt2 = new MyThread1();
- // MyThread1 mt3 = new MyThread1();
- t1.start();
- t2.start();
- t3.start();
- }
-
- }
package com.threadtest;class MyThread1 implements Runnable{ private int ticket =10; private String name; public void run(){ for(int i =0;i<500;i++){ if(this.ticket>0){ System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--)); } } }}public class RunnableDemo { public static void main(String[] args) { // TODO Auto-generated method stub //设计三个线程 MyThread1 mt = new MyThread1(); Thread t1 = new Thread(mt,"一号窗口"); Thread t2 = new Thread(mt,"二号窗口"); Thread t3 = new Thread(mt,"三号窗口");// MyThread1 mt2 = new MyThread1();// MyThread1 mt3 = new MyThread1(); t1.start(); t2.start(); t3.start(); }}
运行结果如下:
Java代码
- 一号窗口卖票---->10
- 三号窗口卖票---->9
- 三号窗口卖票---->7
- 三号窗口卖票---->5
- 三号窗口卖票---->4
- 三号窗口卖票---->3
- 三号窗口卖票---->2
- 三号窗口卖票---->1
- 一号窗口卖票---->8
- 二号窗口卖票---->6
一号窗口卖票---->10三号窗口卖票---->9三号窗口卖票---->7三号窗口卖票---->5三号窗口卖票---->4三号窗口卖票---->3三号窗口卖票---->2三号窗口卖票---->1一号窗口卖票---->8二号窗口卖票---->6
继承Thread类的,我们相当于拿出三件事即三个卖票10张的任务分别分给三个窗口,他们各做各的事各卖各的票各完成各的任务,因为MyThread继承Thread类,所以在new MyThread的时候在创建三个对象的同时创建了三个线程;
实现Runnable的, 相当于是拿出一个卖票10张得任务给三个人去共同完成,new MyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行。
在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。
作者: 皮卫凯 时间: 2012-9-14 09:03
详细步骤
创建方式一:
1、定义一个类继承Thread
2、子类覆盖父类中的run方法
3、建立子类对象的同时,线程也被创建
4、通过调用start方法开启线程
创建方式二:
1、定义类实现Runnable接口
2、覆盖Runnable接口中的run方法
(将线程要运行的代码存放在该run方法中)
3、通过Thread类 建立线程对象
4、将Runnable接口的子类对象 作为实际参数传递给Thread类的构造函数
5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |