Java——创建线程的两种方式

来源:互联网 发布:淘宝客的推广链接 编辑:程序博客网 时间:2024/06/01 07:16
/*四个窗口同时卖票因为是同时,所以使用多线程创建4个线程,都是卖票因为都是卖票,说明四个线程的任务是一样的只需要定义一个类继承Thread*/// 以下是用第一种创建线程的方法(具体方法在我的上一篇博客中有介绍),但是并不符合要求// 线程和线程任务是绑定在一起的/*class Ticket extends Thread{    // 把num设置成静态的实现各个线程共享同一个num    // 但是万一情况复杂,不可能把所有的成员变量都设置成静态的    // 所以,这种创建线程的方法用在这里并不合适    private static int num = 50;    public void run(){        //死循环,会一直进行下去        while(true){            if(num>0){                System.out.println(Thread.currentThread().getName()+"...sale..."+num--);            }        }    }}class test{    public static void main(String[] args){        // 当num等其他成员变量不是静态的时候,每一个线程初始的情况都是一样的,并不符合实际要求        // 但是又不能把所有的成员变量都定义成静态的,所以就有了第二种创建线程的方式        Ticket t1 = new Ticket();        Ticket t2 = new Ticket();        Ticket t3 = new Ticket();        Ticket t4 = new Ticket();        t1.start();        t2.start();        t3.start();        t4.start();    }}*//*为了解决四个线程共享票的问题,使用静态方法肯定是不行的需要使用创建线程的第二种方式:1、创建实现了Runnable接口的子类2、重写Runnable接口中的run方法3、创建实现了Runnable接口的子类的对象4、创建Thread类的对象,也就是在创建线程5、把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法把线程任务进行了描述,也就是面向对象线程任务和线程对象的分离,线程执行什么任务不再重要,只要是实现了Runnable接口的子类对象都可以作为参数传递给Thread的构造方法实现接口的同时,也可以继承父类*///下面用第二种方法创建线程,解决上述问题//1、创建实现了Runnable接口的子类,这是一个描述线程任务的类class Ticket implements Runnable{    public int num = 50;    //2、重写Runnable接口中的run方法    public void run(){        while(true){            if(num>0){                System.out.println(Thread.currentThread().getName()+"...sale..."+num--);                            }        }    }}class test{    //3、创建实现了Runnable接口的子类的对象    public static void main(String[] args){        Ticket t = new Ticket();        //4、创建Thread类的对象,也就是在创建线程        //5、把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法        Thread t1 = new Thread(t);        Thread t2 = new Thread(t);        Thread t3 = new Thread(t);        Thread t4 = new Thread(t);        t1.start();        t2.start();        t3.start();        t4.start();         }}
/*为什么创建线程的第二种方式可以解决卖票问题?    第一种创建线程的方式:线程和线程任务是绑定在一起的,创建4个线程就创建了4份资源    第二种创建线程的方式:线程和线程任务进行了分离,只需要创建一个任务,让4个线程分别去执行*///Thread类也实现了Runnable接口,所以也可以这么写/*class Test extends Thread{}*///但是不推荐上面的写法class Test implements Runnable{}class test{    public static void main(String[] args){        Test test = new Test();        Thread t1 = new Thread(test);    }}