如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点

本文对比了通过继承Thread类与实现Runnable接口两种方式在Java中创建多线程的区别。指出使用Runnable接口更适合多个线程共享同一资源的情况,并提供了具体的代码示例进行说明。

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

如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点,下面给lz举个例子:
Java code
class MyTheard extends Thread{ private int num = 5;//不能声明为静态的全局变量 public void run(){ for(int i=0;i<100;i++){ if(num>0){ System.out.println(Thread.currentThread().getName()+"卖票"+":"+(num--)); } } } } public class TheardDemo01 { public static void main(String[] args) { MyTheard th1 = new MyTheard(); MyTheard th2 = new MyTheard(); MyTheard th3 = new MyTheard(); th1.start(); th2.start(); th3.start(); } }

输出结果:
Thread-0卖票:5
Thread-0卖票:4
Thread-0卖票:3
Thread-0卖票:2
Thread-0卖票:1
Thread-2卖票:5
Thread-2卖票:4
Thread-2卖票:3
Thread-2卖票:2
Thread-2卖票:1
Thread-1卖票:5
Thread-1卖票:4
Thread-1卖票:3
Thread-1卖票:2
Thread-1卖票:1
Java code
class MyThread implements Runnable { private int num = 5; public void run(){ for(int i = 0;i<100;i++){ if(num>0){ System.out.println(Thread.currentThread().getName()+"卖票:"+" "+(num--)); } } } }; public class ThreadDemo02 { public static void main(String[] args) { MyThread mt = new MyThread(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); } }

输出结果:
Thread-1卖票: 5
Thread-1卖票: 2
Thread-1卖票: 1
Thread-0卖票: 4
Thread-2卖票: 3
总结:
通过Rannable接口实现接口有如下的好处:
(1)适合于多个相同的程序代码的线程去处理同一资源。
(2)可以避免由于单继承带来的局限。
(3)增强了程序的健壮性,代码能够被多个线程共享,代码和数据独立。
好的,我会尽力回答你的问题。 首先,我们需要了解一下多线程的概念以及如何使用ThreadRunnable实现多线程多线程是指在一个程序中同时运行多个线程,每个线程都可以独立运行,互干扰。多线程可以提高程序的执行效率,特别是在处理大量数据或需要等待某些操作完成的情况下。 在Java中,我们可以通过继承Thread实现Runnable接口来创建线程继承Thread的方式比较简单,但是由于Java只支持单继承,所以如果我们需要继承其他的话就无法使用这种方式。因此,我们一般采用实现Runnable接口的方式来创建线程。 下面是一个简单的多线程火车票售卖系统的实现。 1. 定义一个Ticket,表示售票系统中的一张票。 ```java public class Ticket { private int number; // 票号 private boolean sold; // 是否已售出 public Ticket(int number) { this.number = number; this.sold = false; } public int getNumber() { return number; } public boolean isSold() { return sold; } public void setSold(boolean sold) { this.sold = sold; } } ``` 2. 定义一个TicketSeller,表示售票员。 ```java public class TicketSeller implements Runnable { private List<Ticket> tickets; // 所有的票 private int soldCount; // 已售票数 public TicketSeller(List<Ticket> tickets) { this.tickets = tickets; this.soldCount = 0; } @Override public void run() { while (soldCount < tickets.size()) { synchronized (tickets) { for (Ticket ticket : tickets) { if (!ticket.isSold()) { ticket.setSold(true); soldCount++; System.out.println(Thread.currentThread().getName() + "售出了第" + ticket.getNumber() + "张票"); break; } } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 3. 定义一个TrainTicketSystem,表示火车票售卖系统。 ```java public class TrainTicketSystem extends JFrame { private List<Ticket> tickets; // 所有的票 private int ticketCount; // 票数 private JTextArea textArea; // 显示信息的文本框 public TrainTicketSystem(int ticketCount) { this.ticketCount = ticketCount; this.tickets = new ArrayList<>(ticketCount); for (int i = 1; i <= ticketCount; i++) { tickets.add(new Ticket(i)); } setTitle("火车票售卖系统"); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); getContentPane().add(panel, BorderLayout.CENTER); panel.setLayout(new BorderLayout(0, 0)); JScrollPane scrollPane = new JScrollPane(); panel.add(scrollPane, BorderLayout.CENTER); textArea = new JTextArea(); textArea.setEditable(false); scrollPane.setViewportView(textArea); JButton btnStartSelling = new JButton("开始售票"); btnStartSelling.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startSelling(); } }); panel.add(btnStartSelling, BorderLayout.SOUTH); } private void startSelling() { textArea.append("开始售票...\n"); TicketSeller seller1 = new TicketSeller(tickets); TicketSeller seller2 = new TicketSeller(tickets); Thread thread1 = new Thread(seller1, "售票员1"); Thread thread2 = new Thread(seller2, "售票员2"); thread1.start(); thread2.start(); } } ``` 4. 在main方法中启动火车票售卖系统。 ```java public class Main { public static void main(String[] args) { TrainTicketSystem system = new TrainTicketSystem(100); system.setVisible(true); } } ``` 在这个实现中,Ticket表示售票系统中的一张票,包含票号和是否已售出两个属性。TicketSeller表示售票员,实现Runnable接口,run方法中使用synchronized关键字实现了对共享数据的同步访问。TrainTicketSystem表示火车票售卖系统,使用JFrame实现了图形界面,包含一个文本框用来显示售票信息,一个开始售票的按钮,点击按钮后会创建两个线程分别模拟两个售票员进行售票。在售票员的run方法中,使用Thread.sleep方法模拟售票的过程,每售出一张票就更新已售票数并在文本框中显示售票信息。 希望这个例子能够帮助你理解如何使用ThreadRunnable实现多线程,以及如何实现数据共享。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值