两种实现多线程方式的区别

本文介绍了Java中实现多线程的两种方式:继承Thread类和实现Runnable接口。通过示例展示了线程如何操作共享资源,强调了线程同步的重要性,解释了为何使用Runnable接口可以更好地实现资源共享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 一个人可以边听音乐,边打扫房间,边吃饭,边看电视。每一件事好比于一个线程,java支持多线程
 * 多任务操作系统中,表面上支持进程并发执行,例如可以一边听音乐,一边聊天,但实际上这些进程不是同时运行的
 * 因为所有的应用程序都是由CPU执行的。对于一个CPU而言,某个时间点只能运行一个程序,也就是说只执行一个进程。
 * CPU在极短时间内在不同的进程之间进行切换,所以给人们以同时多个程序的感觉
 * 一个进程有可以多个线程
 * 例如,在一个java程序启动时,会产生一个进程,该进程中会默认创建一个线程,在这个线程上运行main()方法中的代码
 * 前面的学习中,代码都是按顺序依次往下执行的,没有出现两段程序代码交替运行的效果这样的程序是单线程程序。
 * 如果希望程序中实现多端程序代码交替运行的效果,则需要创建多个线程,即多线程程序,即一个进程执行过程中可以产生多个单线程。
 * java程序中如何实现多线程呢?有两种方式,一是继承java.lang包下的Thread类,重写Thread类的run()方法,在run()方法中实现运行在线程上的代码。
 * 二是实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。
 */

//继承java.lang包下的Thread类,重写Thread类的run()方法,在run()方法中实现运行在线程上的代码。
public class XianChengDemo {

/*
     * 假设售票大厅有4个窗口可发售某日某次列车的100张车票,这时,100张车票可以看作共享资源,4个售票窗口需要建立4个线程。
     * 为了更直观的显示窗口的售票情况,可以通过Thread的currentThread()方法得到当前的线程实例对象,然后调用getName()方法可以获得线程的名称
     */
    public static void main(String[] args) {
        TicketWindow t1 = new TicketWindow();
        t1.start();//创建第一个线程对象TicketWindow并开启
        TicketWindow t2 = new TicketWindow();
        t2.start();//创建第二个线程对象TicketWindow并开启
        TicketWindow t3 = new TicketWindow();
        t3.start();//创建第三个线程对象TicketWindow并开启
        TicketWindow t4 = new TicketWindow();
        t4.start();//创建第四个线程对象TicketWindow并开启
    }
}

class TicketWindow extends Thread {
    private int tickets = 100;//初始100张票
    public void run() {
        while(true) {//通过死循环语句打印语句
            if(tickets>0) {
                Thread th = Thread.currentThread();//获取当前线程
                String th_name=th.getName();//获取当前线程的名字
                System.out.println(th_name+"正在发售第"+tickets--+"张票");
            }
        }
    }

}

运行结果如下

这里每张票都被打印了4次,因为4个线程各自为战,没有共享资源100张票,在程序中创建了4个  TicketWindow 对象,每个线程都有自己的名字,主线程默认main,其他Thread-0,Thread-1依次类推。

接下来我们用Runnale接口来写,并使用构造方法Thread(Runnable target,String name)在创建线程对象的同时指定线程名字

//    上面程序每张票被卖出4次,因为4个线程没有共享100张票,在程序中创建4个TicketWindow对象,就等于创建了4个售票程序。
//    实际要求4个线程应该运行同一个售票程序,应该只创建一个TicketWindow对象,用线程的第二种方法用java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。

public class XianChengDemo {

/*我们创建了四个线程,但是每个线程都去调用这个 TicketWindow对象的run()方法,确保了4个线程访问的是同一个tickets变量,共享100张车票*/
    public static void main(String[] args) {
        TicketWindow tw = new TicketWindow();//创建一个线程对象TicketWindow
        Thread t1 = new Thread(tw,"窗口1");//创建线程并起名为窗口1,然后开启
        t1.start();
        Thread t2 = new Thread(tw,"窗口2");//创建线程并起名为窗口2,然后开启
        t2.start();
        Thread t3 = new Thread(tw,"窗口3");//创建线程并起名为窗口3,然后开启
        t3.start();
        Thread t4 = new Thread(tw,"窗口4");//创建线程并起名为窗口4,然后开启
        t4.start();
    }
}
class TicketWindow implements Runnable {
    private int tickets = 100;//初始100张票
    public void run() {
        while(true) {//通过死循环语句打印语句
            if(tickets>0) {
                Thread th = Thread.currentThread();//获取当前线程
                String th_name=th.getName();//获取当前线程的名字
                System.out.println(th_name+"正在发售第"+tickets--+"张票");
            }
        }
    }
}

运行结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值