A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 僚机i 中级黑马   /  2014-3-30 13:38  /  1150 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

创建线程方式
1继承Thread
子类覆写父类中的run方法,将线程运行的代码存放在run中。
建立子类对象的同时线程也被创建。
通过调用start方法开启线程。

2实现Runnable接口
子类覆盖接口中的run方法。
通过Thread类创建线程,并将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数。
Thread类对象调用start方法开启线程。
可使用匿名内部类来写

Eg:
package july7;
//线程的两种方法

class MyThread extends Thread{
    private String name;

    public MyThread(String name) {
        super();
        this.name = name;
    }

    public void run(){
        System.out.println(name+"启动!");
    }
}

class YourThread implements Runnable{
    private String name;
    public YourThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName()+"第"+i+"次启动!");
        }
    }
}

public class Demo1 {
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            if(i == 50){
                new MyThread("刘昭").start();
                new Thread(new YourThread(""),"章泽天").start();
            }
        }
    }
}
Thread类中run()start()方法的区别如下:
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()
方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个
线程;
两种进程创建方式比较
A extends Thread:
简单
不能再继承其他类了(Java单继承)
同份资源不共享
A implements Runnable:(推荐)
多个线程共享一个目标资源,适合多线程处理同一份资源。
该类还可以继承其他类,也可以实现其他接口。

我的总结:
实现方式,因为避免了单继承的局限性,所以创建线程建议使用第二种方式。

Eg:

package july7;
//线程卖票的例子

class SellTicket extends Thread{
    private String name;
    private int num = 50;
    public SellTicket(String name) {
        super();
        this.name = name;
    }

    public void run(){
        for (int i = 1; i <= num; i++) {
            System.out.println(name+"卖出了第"+i+"张票!");
        }
    }
}

class MySell implements Runnable{
    private int num = 50;

    @Override
    public void run() {
        for (int i = 1; i <= num; i++) {
            System.out.println(Thread.currentThread().getName()+"卖出了第"+i+"张票!");
        }
    }
}

public class Demo2 {
    public static void main(String[] args) throws Exception {

        new SellTicket("A").start();
        new SellTicket("B").start();
        new SellTicket("C").start();

        new Thread(new MySell(),"D").start();
        new Thread(new MySell(),"E").start();
        new Thread(new MySell(),"F").start();

        for (int i = 10; i > 0; i--) {
            System.out.println(i);
            Thread.sleep(1000);
        }
    }
}
为什么要覆盖run方法呢?
Thread类用于描述线程。该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法.
也就是说Thread类中的run方法,用于存储线程要运行的代码。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马