Java多线程基础之线程使用

线程创建

在上一节讲到线程的入口,那么线程怎么创建呢,怎么使用在工作中呢。
创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法,接下来可以分配并启动该子类的实例。

    class AThread extends Thread{

        public void run(){
        //要执行的代码

        }
    }
    AThread aThread = new AThread();
    //启动线程
    aThread.start();

另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。

    class RunnImp implements Runnable{

        public void run(){
        //要执行的代码

        }
    }
    Thread thread = new Thread(new RunnImp());
    //启动线程
    thread.start();

两者的关系

以上两种方法执行效果是一致的。为什么呢,实际上Thread类实现了Runnable接口,该类然后实现run方法。

public class Thread implements Runnable

再从构造函数开始看,初始化Thread的时候,将Runnable作为成员变量,run方法判断target不为空,就执行传进来的Runnable实例的run方法。

    Runnable target;

    public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

    public void run() {
        if (target != null) {
            target.run();
        }
    }

两者区别

刚从上面得知,Thread里面已经装有Runnable,直接使用Thread类不就行了。是可以这么说,但是传参Runnable也有它设计精妙的原因。举个买车票例子,车票数是固定,但是开一个窗口根本不够用,所以就开多个窗口卖票。
先用第二种方法。

    class RunnImp implements Runnable{

        private int ticket = 100; //100张票

        public void run(){
            where(ticket>0){
                ticket --;//卖出去一张
            }
        }
    }
    RunnImp runnImp = new RunnImp();
    Thread thread1 = new Thread(runnImp);
    Thread thread2 = new Thread(runnImp);
    Thread thread3 = new Thread(runnImp);

    thread1.start();
    thread2.start();
    thread3.start();

再看看第一种方法。

    class AThread extends Thread{

    private int ticket = 25; //25张票

        public void run(){
            where(ticket>0){
                ticket --;//卖出去一张
            }
        }

    }

    AThread thread1 = new AThread();
    AThread thread2 = new AThread();
    AThread thread3 = new AThread();
    AThread thread4 = new AThread();

    thread1.start();
    thread2.start();
    thread3.start();
    thread4.start();

如上面代码所示,第二种方法比第一种方法更简洁,更具有扩展性,Runnable也得到复用,资源也能共享。第一种方法就要平均分配票数,代码冗余。有人会问使用全局变量不就行了,但是全局变量声明周期太长,能不用就不用。但是第一种方法就不实用了呢。并不是的,在上面也提到,Thread本身就实现Runnable接口,这样就简约不用创建Runnable。如只执行一个独立的任务,这时再使用第二种方法就显得多余。

    //简约风
    new Thread(){

        public void run(){
        //要执行的代码

        }
    }.start();

总结一下,假如执行独立的任务可以第一种方法,因为够简洁。假如实现资源共享以及提高往后的扩展性可以使用第二方法。

下一节讲线程常用方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值