Java多线程基础之线程使用

来源:互联网 发布:软件服务外包发展方向 编辑:程序博客网 时间:2024/05/17 07:30

线程创建

在上一节讲到线程的入口,那么线程怎么创建呢,怎么使用在工作中呢。
创建新执行线程有两种方法。一种方法是将类声明为 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
原创粉丝点击