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

/*
四个窗口同时卖票

因为是同时,所以使用多线程
创建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);
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值